2011-05-13 66 views
3

升级我的项目我在这里想着关于交易。那么,我不太确定何时应该在Spring中使用我的Hibernate查询事务。不是我完全不明白交易是什么,我想我可以,但是我需要使用get*类型查询的交易,只需设置read-only属性?何时在Spring中使用Hibernate进行事务?

<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*查询是否有效?因为,据我所知,使用事务应该像更新,插入,删除和这样的查询一样完成。我在这里错过了什么吗?

回答

5

使用事务处理在一定程度上取决于需求。

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

在我们公司,我们将所有的语句(即SELECT,UPDATE,DELETE)包含在一个事务中。

此外,除了数据级别之外,事务管理实际上更适合于另一层。一般来说,交易将符合业务需求。例如,如果要求将资金存入一个账户,那么应该使用一些更高级的类/代码来将整个方法标记为交易方式,因为该方法需要作为一个单元来完成(因为可能有多个数据库调用)。

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

+0

我通常也包含访问事务中的数据库的每个业务操作。最近我想知道这是否会导致任何可能减慢应用程序的开销。在这种情况下,使用仅用于创建,删除和更新的事务是否合理? – Giorgio 2012-03-04 18:30:18

+0

我们公司要求我们在每次交易之后提交,甚至包括SELECT语句。我当然可以看到只包装UPDATE语句的位置会产生更少的开销。 – tjg184 2012-03-05 13:18:20

1

This似乎是一个相当不错的答案,为什么你应该。但是,this给出了一些原因。基本上,如果您的修改未完成,您希望在数据最终处于不良状态时使用它们。

1

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

0

要获得关于干将具体问题:如果您使用的是AOP交易与readOnly的真实,你正确设置你的JPA方言冬眠

,春天就会把你的Hibernate Session到无冲洗模式。通过消除不必要的肮脏检查,可以为大批量操作提高性能。所以在这方面值得。

相关问题