升级我的项目我在这里考虑交易。
好吧,问题是我不太确定什么时候应该在Spring中使用事务来进行我的Hibernate查询。
并不是说我完全不明白什么是交易,我想我这样做,但是
是否只需设置get*
属性,我是否需要为read-only
类型查询使用交易?
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" read-only="true" />
<!-- other methods use the default transaction settings -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
对get*
次查询有效吗?
因为,据我所知,使用交易应该像CREATE
,UPDATE
,DELETE
以及此类查询一样。
我在这里错过了什么吗?
答案 0 :(得分:6)
使用交易在某种程度上取决于要求。
显然,在UPDATE和DELETE操作上使用事务是有意义的。例如,如果您需要锁定记录以使另一个线程/请求不会更改读取,则在SELECT语句上使用事务也很有用。这通常是业务要求。
在我们公司,我们在事务中包装所有语句(即SELECT,UPDATE,DELETE)。
此外,除数据级别外,事务管理确实更适合于其他层。通常,交易将符合业务要求。例如,如果要求是将钱存入帐户,则应使用某些更高级别的类/代码将整个方法标记为事务性,因为该特定方法需要作为一个单元完成(因为可能存在多个数据库)调用)。
Spring对事务管理有很多话要说。
答案 1 :(得分:1)
答案 2 :(得分:1)
一个好的规则是在DAO以上的应用程序级别管理事务。这样,如果你有一个数据访问操作A,有时需要在自己的事务中执行,有时应该加入现有的事务,你就不必跳过箍。将此方法与通过AOP管理事务(和Hibernate会话)相结合,并观察您的代码变得更易理解和可维护。
答案 3 :(得分:0)
回答有关吸气剂的具体问题:
如果你使用带有readOnly的AOP事务,和你正确地将你的JPA方言设置为休眠,Spring将把你的Hibernate Session设置为非刷新模式。通过消除不必要的脏检查,这可以为大批量操作带来显着的性能改进。所以在这方面是值得的。