赞
踩
一.事务的含义:多个操作封装在一起,要么同时执行成功,一旦有一个操作执行失败,那么全部执行失败。这里给大家举个例子:比如A给B转账50元,而B没有收到这50元,此时A转账B这个操作也需要进行回滚,恢复到A给B没转账的状态,不然A转账给B的钱就凭空消失了。
二.Spring中事务的实现
1.编程式事务(手动写代码操作事务)
2.声明式事务(利用注解自动开启开启和提交事务
1.编程式事务
SpringBoot为我们内置了两个对象,DataSourceTransactionManager用来获取、提交、回滚事务TransactionDefinition用来定义 事务的属性。
2.声明式事务
在类上添加或方法上添加@Transactional注解,会自动帮我们声明事务,当进入方法时,自动开启事务,当方法结束后,自动帮我们提交事务,当遇到异常的时候,自动的回滚事务
当出现异常的时候,会自动帮我们回滚事务
如果我们加上try catch来处理这个异常的话,那么事务就不会回滚了
那像这种情况,因为它出现了异常就需要回滚,但是因为他被try catch捕获了,不能自动回滚了,我们应该如何解决呢?
(1)手动将这个异常抛出
(2)手动回滚事务
@Transactional作用范围:
当修饰在类上的时候,只有public修饰的方法才生效
当修饰在方法的时候,只有public作为此方法的修饰符时才会生效
@Transactional参数
四.Spring事务的隔离级别:
Spring通过isolation属性来设置事物的隔离级别
Isolation.DEFAULT :以链接的数据库隔离级别为准
事务的传播机制一共分为7种:
下面我们分别从这三类当中取出一种事务来进行演示
1.propagation=Propagation.REQUIRED
支持当前事务:所有的事务执行成功才算成功,一旦有一个事务进行回滚,所有的事务都会进行回滚
我们发现报500了
我们进行访问,此时因为LogService这个类中事务声明的方法里出现了异常,这个事务会进行回滚所以log这条数据不会插入成功,而xiaohzang这条数据也不会插入成功,这是因为它并不会创建新的事务,而是加入到当前事务,此时两个事务可以看成是一个事务,一旦有一个事务进行回滚,其他的事务也会进行回滚。
如果我们把LogService里的那个事务声明的方法里的异常改为手动回滚
此时也会报异常,这是因为内部事务要回滚,但是外部事务感知自己没有异常和手动回滚自己应该要提交,此时外部事务就不知道咋处理了,于是就报异常了,不过最终还是都要回滚 。
2.propagation = Propagation.REQUIRES_NEW
不支持当前事务:各个事务之间不会相互影响,一个事务的回滚不会影响其他的事务。
我们的预期结果是log这条数据不会插入成功,但xiaozhang这条数据会成功插入到用户表中,我们执行一下看一下结果
我们发现500了,查看userinfo数据表,xiaozhang这条数据并没有插入成功
这又是为什么呢?因为异常会让所有的事务都感知到然后都会进行回滚
为了更好的演示,我们将异常改为手动回滚
此时我们再进行访问:
我们查看一下数据库
log这条数据因为进行事务回滚了并没有插入成功
LogService里的这个事务进行回滚,并没有影响其他事务,所以 xiaohzhang这条数据成功插入userinfo表中了
3.propagation=Propagation.NESTED
嵌套事务:事务之间不相互影响,一个事务的回滚不影响其他事务
log中并没有插入数据
userinfo表中插入数据了
嵌套事务能实现部分事务回滚的原因:嵌套事务之所以 能够实现部分事务的回滚,是因为事务中有一个保存点的概念,嵌套事务进入之后建立了一个新的保存点,回滚时只回滚到当前保存点,而之前的事务不受影响。
支持事务(REQUIRED)和嵌套事务(NESTED)的区别:
1.如果所有的事务都执行成功,那么最终结果两者都执行成功
2.支持事务里一旦有一个事务进行回滚,那么所有的事务都会回滚,而嵌套事务会局部回滚,不影响其他事务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。