当前位置: 代码迷 >> J2EE >> spring事务配置解决方法
  详细解决方案

spring事务配置解决方法

热度:301   发布时间:2016-04-17 23:36:20.0
spring事务配置
spring事务aop配置如下:


<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="delete*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException" />
<tx:method name="insert*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.RuntimeException" />
<tx:method name="update*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" />

<tx:method name="find*" propagation="SUPPORTS" />
<tx:method name="get*" propagation="SUPPORTS" />
<tx:method name="select*" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>


问题如下:

如果我dao方法命名为:updateUser  则会满足配置,  则会打开事务。日志提示:Creating new transaction
假如我命名为:refeshUser 则不会打开事务 日志提示:no transaction

两种数据库底层有啥差别? 我看到的效果是一样的,  为什么 no transaction 事务照样插入成功。
我百度“事务”为何物?通过将一组相关操作组合为一个要么全部成功要么全部失败的单元

------解决思路----------------------
没开事务照样保存成功的,那是因为,没开事务等同于每条SQL一个事务,当你有多个SQL 在执行时,那么程序就会停在第一个出错的地方,前面的已经提交了,后面的就终止了,因此这个时候的数据库的数据的状态彼此之间就不一致,就好像刚才说的,A账户少了钱,但B账户没有多出那么多钱来,这就是错误。

引用:
事务为何物?简单地说就是你刚才做的一批事情,要么全部成功地保存下来,要么全部撤销当从未发生过,最早这个出现在银行转账中,从A账户转账到B账户,那么A的钱少了,B的钱多了同样的数字,它分了2个步骤去完成,如果第一步成功了,但第二步失败了,这时候A账户凭少了钱,而B账户没收到钱,那钱哪儿去了?

为了解决这个问题,数据库中就有事务这个功能,当2个步骤全部成功时提交事务(把刚才的修改落实了),如果任意一个步骤失败了,就把刚才作的修改全部撤销。

你上面的 spring 配置中说明了。

第1个是说当方法名是 delete 开头是需要开启事务,收到 RuntimeException 不回滚,其它 Exception 及其子类的异常要回滚。
insert 和 update 有类似的意思,不过你配置的需要试验一下,不要让rollback-for 和 no-rollback-for 互相矛盾(我本人不知道它们矛盾时谁的优先级更高)。

            
<tx:method name="delete*" propagation="REQUIRED" read-only="false"
                rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException" />
            <tx:method name="insert*" propagation="REQUIRED" read-only="false"
                rollback-for="java.lang.RuntimeException" />
            <tx:method name="update*" propagation="REQUIRED" read-only="false"
                rollback-for="java.lang.Exception" />
  相关解决方案