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

温州门户网站建设东莞网站设计

温州门户网站建设,东莞网站设计,益阳市网站建设,整形医院网站建设推广引言 Spring事务一般我们采用注解实现,但是我们构造事务实现的时候常常没察觉失效的情况,本篇文章总结事务失效的六大情况,帮助我们深刻理解事务失效的边界概念 1. 方法自调用 这个主要是针对声明式事务的,经过前面的介绍&…

引言

Spring事务一般我们采用注解实现,但是我们构造事务实现的时候常常没察觉失效的情况,本篇文章总结事务失效的六大情况,帮助我们深刻理解事务失效的边界概念

1.  方法自调用

这个主要是针对声明式事务的,经过前面的介绍,小伙伴们其实也能够看出来,声明式事务底层其实就是 AOP,所以在声明式事务中,我们我们拿到的服务类并不是服务类本身,而是一个代理对象,在这个代理对象中的代理方法中,自动添加了事务的逻辑,所以如果我们直接方法自调用,没有经过这个代理对象,事务就会失效。

我写一段伪代码小伙伴们一起来看下:

public class UserService{@Transactionalpublic void sayHello(){}
}

此时,如果我们在 UserController 中注入 UserService,那么拿到的并不是 UserService 对象本身,而是通过动态代理为 UserService 生成的一个动态代理类,这个动态代理就类似下面这样(伪代码):

public class UserServiceProxy extends UserService{public void sayHello(){try{//开启事务//调用父类 sayHello//提交事务}catch(Exception e){//回滚事务}}
}

所以你最终调用的并不是 UserService 本身的方法,而是动态代理对象中的方法。

因此,如果存在这样的代码:

public class UserService{@Transactionalpublic void sayHello(){}public void useSayHello(){sayHello();}
}

在 useSayHello 中调用 sayHello 方法,sayHello 方法上虽然有事务注解,但是这里的事务不生效(因为调用的不是的动态代理对象中的 sayHello 方法,而是当前对象 this 的 sayHello 方法)。

 

2.  异常被捕获

如果我们在 sayHello 方法中将异常捕获了,那么动态代理类中的方法,就感知不知道目标方法发生异常了,自然也就不会自动处理事务回滚了。还是以前面的 UserServiceProxy 为例:

public class UserServiceProxy extends UserService{public void sayHello(){try{//开启事务//调用父类 sayHello//提交事务}catch(Exception e){//回滚事务}}
}

如果调用调用父类 sayHello的时候,sayHello 方法自动将异常捕获了,那么很明显,这里就不会进行异常回滚了。 

3. 方法非 public

这个算是 Spring 官方的一个强制要求了,声明式事务方法只能是 public,对于非 public 的方法如果想用声明式事务,那得上 AspectJ。

4. 非运行时异常

这个前面 5.3 小节介绍过了,默认情况下,只会捕获 RuntimeException,如果想扩大捕获范围,可以自行配置。

5. 不是 Spring Bean

基于 6.1 小节的理解,来看这个应该也很好懂。声明式事务主要是通过动态代理来处理事务的,如果你拿到手的 UserService 对象就是原原本本的 UserService(如果自己 new 了一个 UserService 就是这种情况),那么事务代码在哪里?没有事务处理的代码,事务自然不会生效。

声明式事务的核心,就是动态代理生成的那个对象,没有用到那个对象,事务就没戏。

6. 数据库不支持事务

这个没啥好说,数据库不支持,Spring 咋配都没用。

总结

Spring 事务常以注解实现,但存在多种可能导致失效的情况。方法自调用因未通过代理对象调用,事务逻辑未执行而失效;异常被捕获,动态代理无法感知异常,无法自动回滚;非 public 方法不符合 Spring 官方对声明式事务的要求而失效;默认仅捕获运行时异常,非此类异常会使事务失效,除非自行配置扩大捕获范围;若对象非 Spring Bean,无事务处理代码,事务不生效;当数据库本身不支持事务时,Spring 配置也无效 。

http://www.hkea.cn/news/90683/

相关文章:

  • 如何做网站窗口网站优化网络推广seo
  • 营销型网站建设效果网络营销策划推广方案
  • 专业的网站搭建多少钱网站seo优化价格
  • 广州公司网站设计制作win10优化大师官网
  • 做调查哪个网站比较可靠百度指数查询
  • 怎么在建设厅网站报名广州网站优化服务
  • 怎么用dw做静态网站b站好看的纪录片免费
  • 济南网站建设那家好网站制作公司有哪些
  • 域名和网站名不一样营销公司
  • discuz做电影网站免费网站seo
  • 惠民建设局网站明年2024年有疫情吗
  • 卫龙的网站是谁做的今日的新闻
  • 厚街找人做网站动态网站设计
  • 永春县住房和城乡规划建设局网站太原seo排名优化软件
  • 怎么上网站后台爱站小工具计算器
  • 网页编辑岗位职责seo上海优化
  • 网站做二维码吗做网站的外包公司
  • 郑州市中原区疫情最新消息上海网站营销seo方案
  • 狂人站群系统中国最权威的网站排名
  • 简单网站开发实例网站运营工作的基本内容
  • 飞机免费代理ip爱站网seo综合查询工具
  • 河南焦作有做网站开发的公司吗巩义网络推广公司
  • 邓州做网站网络广告有哪些形式
  • 爬闪数媒 网站建设网站建站流程
  • 网站建设广州白云百度统计app下载
  • 惠州短视频seoseowhy论坛
  • 肇庆网站快速排名优化温州seo排名公司
  • 北京疫情死亡人数最新消息王通seo赚钱培训
  • 北京做网站的外包公司营销策划方案案例范文
  • 专业做酒店网站关键词优化排名软件流量词