<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 两种数据库底层有啥差别? 我看到的效果是一样的, 为什么 no transaction 事务照样插入成功。 |
|
事务为何物?简单地说就是你刚才做的一批事情,要么全部成功地保存下来,要么全部撤销当从未发生过,最早这个出现在银行转账中,从A账户转账到B账户,那么A的钱少了,B的钱多了同样的数字,它分了2个步骤去完成,如果第一步成功了,但第二步失败了,这时候A账户凭少了钱,而B账户没收到钱,那钱哪儿去了?
为了解决这个问题,数据库中就有事务这个功能,当2个步骤全部成功时提交事务(把刚才的修改落实了),如果任意一个步骤失败了,就把刚才作的修改全部撤销。 你上面的 spring 配置中说明了。 第1个是说当方法名是 delete 开头是需要开启事务,收到 RuntimeException 不回滚,其它 Exception 及其子类的异常要回滚。 <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" /> |
|
事务就是你给你老婆转账100W,转了之后如果没成功比如那边银行断线了,转出去的钱又回来了。
没有事务就是你转了之后断线了你转出去的没了,你老婆也没收到,丢掉了100W |
|
60分 |
没开事务照样保存成功的,那是因为,没开事务等同于每条SQL一个事务,当你有多个SQL 在执行时,那么程序就会停在第一个出错的地方,前面的已经提交了,后面的就终止了,因此这个时候的数据库的数据的状态彼此之间就不一致,就好像刚才说的,A账户少了钱,但B账户没有多出那么多钱来,这就是错误。
|
那请问,如果我不开启事务, 一条sql批处理 一大堆数据, 运行中 某条异常, 那我 异常前的会回滚吗? |
|
我试过了,不会~,
那岂不是我 用mybatis 免dao实现的方法,用不着配置这个? |
|
你有定义update*但是没有定义refesh*你用refeshUser当然没用啦
回滚是必须是一个错误就全部回滚的,这才是事务啊 |
|
觉得你这样配置很麻烦、
<tx…/> 都配置了吗? |