网站建设客户来源,动易网站安装子目录中,wordpress倒入数据,南海网站建设一.事务的含义:多个操作封装在一起#xff0c;要么同时执行成功#xff0c;一旦有一个操作执行失败#xff0c;那么全部执行失败。这里给大家举个例子:比如A给B转账50元#xff0c;而B没有收到这50元#xff0c;此时A转账B这个操作也需要进行回滚#xff0c;恢复到A给B没…一.事务的含义:多个操作封装在一起要么同时执行成功一旦有一个操作执行失败那么全部执行失败。这里给大家举个例子:比如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参数 三.Transactional ⼯作原理 Transactional 是基于 AOP 实现的AOP ⼜是使⽤动态代理实现的。如果⽬标对象实现了接⼝默 认情况下会采⽤ JDK 的动态代理如果⽬标对象没有实现了接⼝,会使⽤ CGLIB 动态代理。 Transactional 在开始执⾏业务之前通过代理先开启事务在执⾏成功之后再提交事务。如果中途 遇到的异常则回滚事务。 四.Spring事务的隔离级别: Spring通过isolation属性来设置事物的隔离级别 Isolation.DEFAULT :以链接的数据库隔离级别为准 Isolation.READ_UNCOMMITTED读未提交会产生脏读和幻读和不可重复读的问题 Isolation.READ_COMMITTED读已提交不会产生脏读的问题但会产生不可重复读、幻读的问题 Isolation.REPEATABLE_READ可重复读(Mysql数据库的默认事务隔离级别会产生幻读的问题 Isolation.SERIALIZABLE串行化能解决所有的并发问题但效率太低 脏读A事务在写完数据后并没有进行提交B事务读取完数据A事务进行回滚 不可重复读:A事务写完数据后提交事务B数据进行读取此时A事务再将提交后的数据进行修改然后再提交此时B事务前后读取的数据是不一样的。 幻读:A事务两次查询得到的结果集不同因为B事务新增了一部分数据 spring的事务隔离级别比mysql的事务隔离级别多了一种多了Isolcation.DEFAULT 五.Spring事务的传播机制: 解决的是一个事务再多个方法里被调用的问题 事务的传播机制一共分为7种: 下面我们分别从这三类当中取出一种事务来进行演示 1.propagationPropagation.REQUIRED 支持当前事务:所有的事务执行成功才算成功一旦有一个事务进行回滚所有的事务都会进行回滚 我们发现报500了 我们进行访问此时因为LogService这个类中事务声明的方法里出现了异常这个事务会进行回滚所以log这条数据不会插入成功而xiaohzang这条数据也不会插入成功这是因为它并不会创建新的事务而是加入到当前事务此时两个事务可以看成是一个事务一旦有一个事务进行回滚其他的事务也会进行回滚。 如果我们把LogService里的那个事务声明的方法里的异常改为手动回滚 此时也会报异常这是因为内部事务要回滚但是外部事务感知自己没有异常和手动回滚自己应该要提交此时外部事务就不知道咋处理了于是就报异常了不过最终还是都要回滚 。 2.propagation Propagation.REQUIRES_NEW 不支持当前事务:各个事务之间不会相互影响一个事务的回滚不会影响其他的事务。 我们的预期结果是log这条数据不会插入成功但xiaozhang这条数据会成功插入到用户表中我们执行一下看一下结果 我们发现500了查看userinfo数据表xiaozhang这条数据并没有插入成功 这又是为什么呢因为异常会让所有的事务都感知到然后都会进行回滚 为了更好的演示我们将异常改为手动回滚 此时我们再进行访问: 我们查看一下数据库 log这条数据因为进行事务回滚了并没有插入成功 LogService里的这个事务进行回滚并没有影响其他事务所以 xiaohzhang这条数据成功插入userinfo表中了 3.propagationPropagation.NESTED 嵌套事务:事务之间不相互影响一个事务的回滚不影响其他事务 log中并没有插入数据 userinfo表中插入数据了 嵌套事务能实现部分事务回滚的原因:嵌套事务之所以 能够实现部分事务的回滚是因为事务中有一个保存点的概念嵌套事务进入之后建立了一个新的保存点回滚时只回滚到当前保存点而之前的事务不受影响。 支持事务REQUIRED和嵌套事务(NESTED)的区别: 1.如果所有的事务都执行成功那么最终结果两者都执行成功 2.支持事务里一旦有一个事务进行回滚那么所有的事务都会回滚而嵌套事务会局部回滚不影响其他事务。