Code Bye

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 事务照样插入成功。
我百度“事务”为何物?通过将一组相关操作组合为一个要么全部成功要么全部失败的单元

事务为何物?简单地说就是你刚才做的一批事情,要么全部成功地保存下来,要么全部撤销当从未发生过,最早这个出现在银行转账中,从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" />
事务就是你给你老婆转账100W,转了之后如果没成功比如那边银行断线了,转出去的钱又回来了。
没有事务就是你转了之后断线了你转出去的没了,你老婆也没收到,丢掉了100W

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

事务为何物?简单地说就是你刚才做的一批事情,要么全部成功地保存下来,要么全部撤销当从未发生过,最早这个出现在银行转账中,从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" />
引用 3 楼 humanity 的回复:

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

Quote: 引用 1 楼 humanity 的回复:

事务为何物?简单地说就是你刚才做的一批事情,要么全部成功地保存下来,要么全部撤销当从未发生过,最早这个出现在银行转账中,从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" />

那请问,如果我不开启事务, 一条sql批处理 一大堆数据, 运行中 某条异常, 那我 异常前的会回滚吗?

我试过了,不会~,  

那岂不是我 用mybatis 免dao实现的方法,用不着配置这个?

你有定义update*但是没有定义refesh*你用refeshUser当然没用啦
回滚是必须是一个错误就全部回滚的,这才是事务啊
觉得你这样配置很麻烦、

<tx…/>
<aop..>

都配置了吗?


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明spring事务配置