佛山网站快照优化公司,一级域名二级域名哪个好,信息流推广实施策划书,学校网站建设栏目前言
#x1f31f;#x1f31f;本期讲解关于spring 事务传播机制介绍~~~
#x1f308;感兴趣的小伙伴看一看小编主页#xff1a;GGBondlctrl-CSDN博客
#x1f525; 你的点赞就是小编不断更新的最大动力
#x1f386;那么废话…
前言
本期讲解关于spring 事务传播机制介绍~~~
感兴趣的小伙伴看一看小编主页GGBondlctrl-CSDN博客 你的点赞就是小编不断更新的最大动力
那么废话不多说直接开整吧~~ 目录
️1.事务的隔离级别
1.1MySQL事务隔离级别
1.2Spring事务隔离级别
️2.Spring事务传播机制
2.1什么是事务的传播机制
2.2事务隔离与传播的区别
2.3事务的传播机制
2.4事务传播机制代码演示
2.4.1REQUIRED 2.4.2REQUIRES_NEW
2.4.3NEVER
2.4.4NESTED
2.5NESTED和REQUIRED 区别
️3.总结 ️1.事务的隔离级别
1.1MySQL事务隔离级别
读未提交(READ UNCOMMITTED): 读未提交, 也叫未提交读. 该隔离级别的事务可以看到其他事务中未提交的数据. 因为其他事务未提交的数据可能会发⽣回滚, 但是该隔离级别却可以读到, 我们把该级别读到的数据称之为脏数据, 这个问题称之为脏读.就是一个事务还没有写完另一个事务就在读了 读提交(READ COMMITTED): 读已提交, 也叫提交读. 该隔离级别的事务能读取到已经提交事务的数据 该隔离级别不会有脏读的问题.但由于在事务的执⾏中可以读取到其他事务提交的结果, 所以在不同时间的相同 SQL 查询可能会得到不同的结果, 这种现象叫做不可重复读 大致就是事务A在写完后B读了之后A又再次修改了那么B再次读之后就会发现两次的结果不一样 可重复读(REPEATABLE READ): 事务不会读到其他事务对已有数据的修改, 即使其他事务已提交. 也就可以确保同⼀事务多次查询的结果⼀致, 但是其他事务新插⼊的数据, 是可以感知到的. 这也就引发了幻读问题. 可重复读, 是 MySQL 的默认事务隔离级别. ⽐如此级别的事务正在执⾏时, 另⼀个事务成功的插⼊了某条数据, 但因为它每次查询的结果都是⼀样的, 所以会导致查询不到这条数据, ⾃⼰重复插⼊时⼜失败(因为唯⼀约束的原因). 明明在事务中查询不到这条信息但⾃⼰就是插⼊不进去, 这个现象叫幻读 串⾏化(SERIALIZABLE): 序列化, 事务最⾼隔离级别. 它会强制事务排序, 使之不会发⽣冲突, 从⽽解决了脏读, 不可重复读和幻读问题, 但因为执⾏效率低, 所以真正使⽤的场景并不多 1.2Spring事务隔离级别
Spring 中事务隔离级别有5 种:
1. Isolation.DEFAULT : 以连接的数据库的事务隔离级别为主. 2. Isolation.READ_UNCOMMITTED : 读未提交, 对应SQL标准中 READ UNCOMMITTED 3. Isolation.READ_COMMITTED : 读已提交,对应SQL标准中 READ COMMITTED 4. Isolation.REPEATABLE_READ : 可重复读, 对应SQL标准中 REPEATABLE READ 5. Isolation.SERIALIZABLE : 串⾏化, 对应SQL标准中 SERIALIZABLE
设置事务的隔离级别代码如下 Transactional(rollbackFor Exception.class, isolation Isolation.DEFAULT)//设置所有回滚异常类型RequestMapping(/r7)public Boolean r7(String userName, String password) throws IOException {Integer result userService.registUser(userName, password);System.out.println(插入用户表, result: result);if (true){throw new IOException();}return true;}
解释
在代码中注解里的参数rollbackfor指定所有异常都需要进行回滚然后isolation指定是与数据库的事务隔离级别是一致的那么这里的spring事务的隔离级别就是可重复读
️2.Spring事务传播机制
2.1什么是事务的传播机制 事务传播机制就是: 多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的 就比如两个方法都被transaction修饰了假如这里的两个方法存在调用的关系那么这里的事务是如何进行传播的是使用A的事务还是使用B的事务呢
2.2事务隔离与传播的区别
事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题
如下图 ⽽事务传播机制解决的是⼀个事务在多个节点(⽅法)中传递的问题 2.3事务的传播机制
Transactional 注解⽀持事务传播机制的设置, 通过 propagation 属性来指定传播⾏为. Spring 事务传播机制有以下 7 种
B是被调用的一方serviceA是调用的一方controller
1. Propagation.REQUIRED : 默认的事务传播级别. 如果当前存在事务, 则加⼊该事务. 如果当前没 有事务, 则创建⼀个新的事务. A有事务B就直接使用A的事务如果A没有事务B创建一个事务 2. Propagation.SUPPORTS : 如果当前存在事务, 则加⼊该事务. 如果当前没有事务, 则以⾮事务的⽅式继续运⾏. A有事务B就直接使用A的事务如果A没有事务B以非事务的方式进行运行 3. Propagation.MANDATORY :强制性. 如果当前存在事务, 则加⼊该事务. 如果当前没有事务, 则 抛出异常. A有事务B就直接使用A的事务如果A没有事务那么就直接抛出异常 4. Propagation.REQUIRES_NEW : 创建⼀个新的事务. 如果当前存在事务, 则把当前事务挂起. 也 就是说不管外部⽅法是否开启事务, Propagation.REQUIRES_NEW 修饰的内部⽅法都会新开 启⾃⼰的事务, 且开启的事务相互独⽴, 互不⼲扰. 就是不管A有无事务B都创建新的事务 5. Propagation.NOT_SUPPORTED : 以⾮事务⽅式运⾏, 如果当前存在事务, 则把当前事务挂起(不⽤). 就是不管A有无事务B都直接以非事务的方式进行运行 6. Propagation.NEVER : 以⾮事务⽅式运⾏, 如果当前存在事务, 则抛出异常 如果A事务存在那么就直接抛出异常 7. Propagation.NESTED : 如果当前存在事务, 则创建⼀个事务作为当前事务的嵌套事务来运⾏. 如果当前没有事务, 则该取值等价于 PROPAGATION_REQUIRED 没有事务就创建事务有的话就干点其他的事情 2.4事务传播机制代码演示
2.4.1REQUIRED
controller控制层代表的A
RequestMapping(/user)
RestController
public class UserController2 {Autowiredprivate UserService userService;Autowiredprivate LogService logService;Transactional(propagation Propagation.REQUIRED)RequestMapping(/p1)public String r3(String name, String password) {//⽤⼾注册userService.registUser(name, password);//记录操作⽇志logService.insertLog(name, ⽤⼾注册);return p1;}
}其余两个service
登录日志打印
Service
public class LogService {Autowiredprivate LogInfoMapper logInfoMapper;Transactional(propagation Propagation.REQUIRED)public void insertLog(String userName,String op){logInfoMapper.insert(userName,用户注册);int a10/0;}
}user登录
Service
public class UserService {Autowiredprivate UserInfoMapper userInfoMapper;Transactional(propagation Propagation.REQUIRED)public Integer registUser(String userName, String password) {Integer result userInfoMapper.insert(userName, password);return result;}
}输出情况打印的日志如下 1. p1 ⽅法开始事务 2. ⽤⼾注册, 插⼊⼀条数据 (执⾏成功) (和p1 使⽤同⼀个事务) 3. 记录操作⽇志, 插⼊⼀条数据(出现异常, 执⾏失败) (和p1 使⽤同⼀个事务) 4. 因为步骤3出现异常, 事务回滚. 步骤2和3使⽤同⼀个事务, 所以步骤2的数据也回滚了. 2.4.2REQUIRES_NEW
我们将这里的两个service层改成REQUIRES_NEW 这里的其中一个事务进行了提交 另一个代码存在算数异常的就没有进行提交
这里就是单独创建了自己的事务这里的两个service层创建的两个事务就不会相互影响所以其中一个提交另一个进行了回滚的操作
2.4.3NEVER
我们将其中一个代码传播机制改变
Service
public class UserService {Autowiredprivate UserInfoMapper userInfoMapper;Transactional(propagation Propagation.NEVER)public Integer registUser(String userName, String password) {Integer result userInfoMapper.insert(userName, password);return result;}
} 输出的日志如下所示 那么这里可以看到报错信息就是A调用层存在事务导致 报错
2.4.4NESTED
将上述UserService 和LogService 中相关⽅法事务传播机制改为 Propagation.NESTED
小编这里就不演示代码了大家可以自己去试一试
打印日志如下 由于是嵌套事务, LogService 出现异常之后, 往上找调⽤它的⽅法和事务, 所以⽤⼾注册也失败 了.最终结果是两个数据都没有添加 p1事务可以认为是⽗事务, 嵌套事务是⼦事务. ⽗事务出现异常, ⼦事务也会回滚, ⼦事务出现异常, 如果不进⾏处理, 也会导致⽗事务回滚可以认为是REQUIRED但是不完全是
2.5NESTED和REQUIRED 区别
我们知道当两个方法不存在问题时这里的两种传播机制是没有啥区别的但是当出现问题时我们可以发现情况如上图所示但是真的没有区别吗答案是否定的
Service
public class LogService {Autowiredprivate LogInfoMapper logInfoMapper;Transactional(propagation Propagation.NESTED)public void insertLog(String userName,String op){try {int a10/0;}catch (Exception e){TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}logInfoMapper.insert(userName,用户注册); }
}
重新运⾏程序, 发现⽤⼾表数据添加成功, ⽇志表添加失败. LogService 中的事务已经回滚, 但是嵌套事务不会回滚嵌套之前的事务, 也就是说嵌套事务可以实 现部分事务回滚
但是对于REQUIRED 如果回滚就是回滚所有事务, 不能实现部分事务的回滚. (因为属于同⼀个事务) 嵌套事务之所以能够实现部分事务的回滚, 是因为事务中有⼀个保存点(savepoint)的概念, 嵌套事务进⼊之后相当于新建了⼀个保存点, ⽽滚回时只回滚到当前保存点. 这里是小编的理解大家有问题或者质疑可以私信我哟~~~
️3.总结
本期讲解了关于MySQL事务的隔离级别回顾以及spring的事务隔离级别以及事务传播机制分别从概念和代码进行了演示~~~
~~~~最后希望与诸君共勉共同进步 以上就是本期内容了 感兴趣的话就关注小编吧。 期待你的关注~~~
文章转载自: http://www.morning.zpdjh.cn.gov.cn.zpdjh.cn http://www.morning.kpypy.cn.gov.cn.kpypy.cn http://www.morning.crsqs.cn.gov.cn.crsqs.cn http://www.morning.wgkz.cn.gov.cn.wgkz.cn http://www.morning.skql.cn.gov.cn.skql.cn http://www.morning.jybj.cn.gov.cn.jybj.cn http://www.morning.drzkk.cn.gov.cn.drzkk.cn http://www.morning.xqcgb.cn.gov.cn.xqcgb.cn http://www.morning.phjyb.cn.gov.cn.phjyb.cn http://www.morning.kbyp.cn.gov.cn.kbyp.cn http://www.morning.nnwmd.cn.gov.cn.nnwmd.cn http://www.morning.dztp.cn.gov.cn.dztp.cn http://www.morning.wdhhz.cn.gov.cn.wdhhz.cn http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn http://www.morning.thbnt.cn.gov.cn.thbnt.cn http://www.morning.zrbpx.cn.gov.cn.zrbpx.cn http://www.morning.wclxm.cn.gov.cn.wclxm.cn http://www.morning.bktly.cn.gov.cn.bktly.cn http://www.morning.rfxyk.cn.gov.cn.rfxyk.cn http://www.morning.hgcz.cn.gov.cn.hgcz.cn http://www.morning.qhmql.cn.gov.cn.qhmql.cn http://www.morning.jfsbs.cn.gov.cn.jfsbs.cn http://www.morning.kdnrc.cn.gov.cn.kdnrc.cn http://www.morning.ghjln.cn.gov.cn.ghjln.cn http://www.morning.lphtm.cn.gov.cn.lphtm.cn http://www.morning.gwxwl.cn.gov.cn.gwxwl.cn http://www.morning.pjfmq.cn.gov.cn.pjfmq.cn http://www.morning.ruyuaixuexi.com.gov.cn.ruyuaixuexi.com http://www.morning.mzpd.cn.gov.cn.mzpd.cn http://www.morning.ddqdl.cn.gov.cn.ddqdl.cn http://www.morning.wwxg.cn.gov.cn.wwxg.cn http://www.morning.zyrcf.cn.gov.cn.zyrcf.cn http://www.morning.bpp999.com.gov.cn.bpp999.com http://www.morning.szoptic.com.gov.cn.szoptic.com http://www.morning.nsfxt.cn.gov.cn.nsfxt.cn http://www.morning.mmtjk.cn.gov.cn.mmtjk.cn http://www.morning.ptqds.cn.gov.cn.ptqds.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.cwyrp.cn.gov.cn.cwyrp.cn http://www.morning.xltdh.cn.gov.cn.xltdh.cn http://www.morning.fglth.cn.gov.cn.fglth.cn http://www.morning.jwxnr.cn.gov.cn.jwxnr.cn http://www.morning.mgmqf.cn.gov.cn.mgmqf.cn http://www.morning.jxwhr.cn.gov.cn.jxwhr.cn http://www.morning.spwm.cn.gov.cn.spwm.cn http://www.morning.mfbcs.cn.gov.cn.mfbcs.cn http://www.morning.xmtzk.cn.gov.cn.xmtzk.cn http://www.morning.dschz.cn.gov.cn.dschz.cn http://www.morning.nqyfm.cn.gov.cn.nqyfm.cn http://www.morning.lkgqb.cn.gov.cn.lkgqb.cn http://www.morning.lkbyj.cn.gov.cn.lkbyj.cn http://www.morning.xqmd.cn.gov.cn.xqmd.cn http://www.morning.tfznk.cn.gov.cn.tfznk.cn http://www.morning.wypyl.cn.gov.cn.wypyl.cn http://www.morning.rxrw.cn.gov.cn.rxrw.cn http://www.morning.zqkms.cn.gov.cn.zqkms.cn http://www.morning.jpmcb.cn.gov.cn.jpmcb.cn http://www.morning.jsrnf.cn.gov.cn.jsrnf.cn http://www.morning.qxwgx.cn.gov.cn.qxwgx.cn http://www.morning.ljzqb.cn.gov.cn.ljzqb.cn http://www.morning.mqwnz.cn.gov.cn.mqwnz.cn http://www.morning.txfzt.cn.gov.cn.txfzt.cn http://www.morning.mgwdp.cn.gov.cn.mgwdp.cn http://www.morning.yqyhr.cn.gov.cn.yqyhr.cn http://www.morning.hwbmn.cn.gov.cn.hwbmn.cn http://www.morning.rqqlp.cn.gov.cn.rqqlp.cn http://www.morning.mrxqd.cn.gov.cn.mrxqd.cn http://www.morning.qkgwx.cn.gov.cn.qkgwx.cn http://www.morning.ltrms.cn.gov.cn.ltrms.cn http://www.morning.bpmns.cn.gov.cn.bpmns.cn http://www.morning.zpqk.cn.gov.cn.zpqk.cn http://www.morning.dkzwx.cn.gov.cn.dkzwx.cn http://www.morning.zfrs.cn.gov.cn.zfrs.cn http://www.morning.plqhb.cn.gov.cn.plqhb.cn http://www.morning.wnmdt.cn.gov.cn.wnmdt.cn http://www.morning.dwfzm.cn.gov.cn.dwfzm.cn http://www.morning.wzyfk.cn.gov.cn.wzyfk.cn http://www.morning.qlck.cn.gov.cn.qlck.cn http://www.morning.xpzgg.cn.gov.cn.xpzgg.cn http://www.morning.lkkgq.cn.gov.cn.lkkgq.cn