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

山海关建设局网站网站收录工具

山海关建设局网站,网站收录工具,vps网站目录权限设置,testimonials wordpress事务失效场景 方法用private或final修饰 Spring底层使用了AOP,而AOP的实现方式有两种,分别是JDK动态代理和CGLIB,JDK动态代理是实现抽象接口,CGLIB是继承父类,无论哪种方式,都需要重写方法来进行方法增强,而…

事务失效场景

  1. 方法用private或final修饰
    Spring底层使用了AOP,而AOP的实现方式有两种,分别是JDK动态代理和CGLIB,JDK动态代理是实现抽象接口,CGLIB是继承父类,无论哪种方式,都需要重写方法来进行方法增强,而用private或final修饰的方法都是不能被重写的

  2. 方法自调用(如何解决方法自调用导致的事务失效)
    UserService类中开启A方法调用B方法,直接调用A方法会导致B方法的Transactional注解不生效,从而导致事务失效

@Component
public class UserService{@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void A() {//this.B()和B()同理B();}@Transactional(propagation = Propagation.NEVER)public void B(){jdbcTemplate.execute("insert into user values(1, 1, '1')");throw new NullPointerException();}
}

为什么事务会失效?Spring生成的代理类大致如下,调用A方法会执行$Proxy0.A(),而B方法是被代理对象target调用的,所以方法不会被增强

public class $Proxy0 extends UserService {private UserService target;public void A() {//建立数据库连接ConnectionConnection connection = DriverManager.getConnection("jdbc:mysql:///user");connection.setAutoCommit(false);try{target.A();}catch(RuntimeException exception){connection.rollback();return;}connection.commit();}
}
  1. 多线程调用
    执行SQL时会从ThreadLocal里获取数据库连接对象,而ThreadLocal是线程隔离的,新线程无法从主线程的ThreadLocal里获取数据库连接对象,所以只能新建一个数据库连接来执行SQL,此时autoCommit默认是true,执行完SQL就会自动提交,抛出异常也就不能回滚了
@Component
public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void B() {new Thread(() -> {jdbcTemplate.execute("insert into user values(1, 1, '1')");throw new NullPointerException();}).start();}
}
  1. 类没有被Spring管理

  2. 数据库不支持事务

  3. 异常被手动try-catch掉了

如何解决方法自调用导致的事务失效

  • 自己注入自己
@Component
public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Autowiredprivate UserService userService;public void A() {//从Spring容器中取出代理对象userService.B();}@Transactionalpublic void B() {jdbcTemplate.execute("insert into user values(1, 1, '1')");throw new NullPointerException();}
}
  • 把被调用的方法拆分到别的Bean中,然后再把这个Bean注入进来
  • AopContext.currentProxy() + @EnableAspectJAutoProxy(exposeProxy = true)
@Component
public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;public void A() {UserService userService = (UserService) AopContext.currentProxy();userService.B();}@Transactionalpublic void B() {jdbcTemplate.execute("insert into user values(1, 1, '1')");throw new NullPointerException();}
}
http://www.zhongyajixie.com/news/62839.html

相关文章:

  • 葫芦岛网站制作百度关键词排名代做
  • 做301到别人网站市场营销策划方案
  • 公众号小程序开通seo网址
  • 广州高端网站制作公司哪家好天津关键词优化平台
  • 网站的标志是什么字体做电商需要学哪些基础
  • 开发公司移交物业协议书上海企业优化
  • 富士康郑州现状seo站内优化技巧
  • 国内真正的永久建站排名软件
  • 网络广告投放渠道有哪些江苏seo技术教程
  • 网站开发竞聘报告域名ip查询入口
  • 婚庆网站哪个网站好网页推广链接怎么做
  • 如何做正规的采集网站论坛seo教程
  • 怎么做视频解析的网站搜索引擎优化指的是什么
  • 做品牌推广用什么网站广东的seo产品推广服务公司
  • 金融企业网站制作网络推广公司哪里好
  • 百度网页打不开其他网页都能打开seo是什么意思?
  • seo 网站结构优化打开百度搜索
  • 上海市建设和交通委员会网站百度大搜推广开户
  • 福州做网站公司有哪些端点seo博客
  • 玉树州公司网站建设东莞今日新闻大事
  • 沈阳自助模板建站百度关键词怎么设置
  • 济南行业网站开发东莞网站建设做网站
  • 自己做交易网站企业营销策划及推广
  • wordpress后台网页无法访问临沂seo公司
  • 蓝领网站做的最好合肥seo关键词排名
  • 公众号网站怎么做的优化什么建立生育支持政策体系
  • 网站关键词推广做自然排名地推团队联系方式
  • 九度互联网站建设深圳seo关键词优化
  • 两学一做网站安徽省sem是做什么的
  • 网站域名需icp备案免费发广告的网站大全