当前位置: 首页 > news >正文

天津网络优化网站建设南京重庆网站建设

天津网络优化网站建设,南京重庆网站建设,四川省城乡建设厅门户网站,凡客诚品现状2022一.事务的含义:多个操作封装在一起,要么同时执行成功,一旦有一个操作执行失败,那么全部执行失败。这里给大家举个例子:比如A给B转账50元,而B没有收到这50元,此时A转账B这个操作也需要进行回滚,恢复到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.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.支持事务里一旦有一个事务进行回滚,那么所有的事务都会回滚,而嵌套事务会局部回滚,不影响其他事务。

http://www.yayakq.cn/news/444201/

相关文章:

  • 保定网站制作设计哪个公司好营销型网站建设营销型
  • php开发手机网站网站建设开发图片
  • 寻亲网站开发设计文档大学生ppt自我介绍幻灯片
  • 织梦做淘宝客网站抖音优化是什么意思
  • 推广网站的几种方法wordpress logo替换
  • 长春网站优化团队成都网站制作的公司
  • 主任说到学校新网站的建设工作网站空间源码
  • 招商网站设计微慕wordpress插件
  • 建站公司兴田德润简介为什么菜市场不可以做网站
  • 深圳网站建设公司 犀牛云 移动云网站网站** 教程
  • 南京软月网站建设公司软件人员外包
  • 如何链接自己做的网站网站建设月薪
  • 玩具电子商务网站建设论文信用网站建设意见
  • 哪些网站做任务可以赚钱博客模板wordpress
  • 百度提交网站改版免费设计室内装修网址
  • 地方门户网站发展趋势跨境电商网站建设成本
  • 闵行交大网站建设网站服务器租用怎么购买
  • 影院网站模板网站编程学习
  • 网站后台挂马怎么处理网络运营需要什么技术
  • html链接网站模板爱站网关键词工具
  • 设计一个官方网站推广广告为企业进行网站建设方案
  • 教育培训网站官网网站抓取超时错误
  • 怎么做合买彩票网站编写网站 语言
  • wordpress上下页惠州seo
  • 网站开发文档建立网站的步骤筝晃湖南岚鸿官网
  • 许昌市住房和城乡建设局网站公司做网站自己注册域名
  • 网站建设中主页源码冶金工业建设工程定额总站网站
  • 个人怎么做贷款网站求好用的seo软件
  • 国家建设环保局网站济南网络电视台
  • 网站标题怎么设置旅游型网站建设