什么时候在Spring中使用Hibernate的事务?

时间:2011-05-13 15:06:23

标签: java spring-3 spring-transactions hibernate3

升级我的项目我在这里考虑交易。
好吧,问题是我不太确定什么时候应该在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*次查询有效吗? 因为,据我所知,使用交易应该像CREATEUPDATEDELETE以及此类查询一样。 我在这里错过了什么吗?

4 个答案:

答案 0 :(得分:6)

使用交易在某种程度上取决于要求。

显然,在UPDATE和DELETE操作上使用事务是有意义的。例如,如果您需要锁定记录以使另一个线程/请求不会更改读取,则在SELECT语句上使用事务也很有用。这通常是业务要求。

在我们公司,我们在事务中包装所有语句(即SELECT,UPDATE,DELETE)。

此外,除数据级别外,事务管理确实更适合于其他层。通常,交易将符合业务要求。例如,如果要求是将钱存入帐户,则应使用某些更高级别的类/代码将整个方法标记为事务性,因为该特定方法需要作为一个单元完成(因为可能存在多个数据库)调用)。

Spring对事务管理有很多话要说。

答案 1 :(得分:1)

This似乎是一个相当不错的答案,为什么你应该。但是,this给出了一些不这样做的理由。基本上,如果您的修改没有完成,那么当数据最终处于错误状态时,您希望使用它们。

答案 2 :(得分:1)

一个好的规则是在DAO以上的应用程序级别管理事务。这样,如果你有一个数据访问操作A,有时需要在自己的事务中执行,有时应该加入现有的事务,你就不必跳过箍。将此方法与通过AOP管理事务(和Hibernate会话)相结合,并观察您的代码变得更易理解和可维护。

答案 3 :(得分:0)

回答有关吸气剂的具体问题:

如果你使用带有readOnly的AOP事务,你正确地将你的JPA方言设置为休眠,Spring将把你的Hibernate Session设置为非刷新模式。通过消除不必要的脏检查,这可以为大批量操作带来显着的性能改进。所以在这方面是值得的。