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

江西合创建设工程有限公司 网站做网站程序

江西合创建设工程有限公司 网站,做网站程序,网站建设企业合作邀请函,做营销网站那个好事务失效场景 方法用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.laogonggong.com/news/64547.html

相关文章:

  • 3深圳网站建设电商网站平台搭建
  • 做网站jijianjianzhancgi做网站
  • 免费营销软件网站seo培训赚钱
  • wordpress建影视网站大商创 多用户商城
  • 商丘网站建设服务网站建设大作业电子版
  • 学生做家教网站个人网页设计作品集分析
  • 东莞做微网站建设价格海派虫网站推广软件
  • 做任务的奖金网站在百度上打广告找谁
  • 江门站官网盐城网站建设与网页制作
  • 沈阳网站建设找思路重庆设计网站
  • 西城h5网站建设wordpress开发cms
  • 备案名 网站名官方网站建设 省心磐石网络
  • 大学生创新创业网站开发家庭宽带做网站稳定
  • 网站买东西第三方怎么做互联网最赚钱的行业
  • 门户网站的推广语文建设投稿网站
  • 内部网站可以做ipc备案wordpress优化记录
  • 免费代理服务器网站网站建设注意事项
  • 营销型网站知识免费写文章的软件
  • 网站建设维护面试英国三大运营商
  • 用python做网站不常见西安百度公司官网
  • 网站开发服务器的选择西安企业家名单
  • 网络公司网站官网公司网站 英文
  • 如何用腾讯云建设自己网站怎样搭建网站视频教程
  • 网站建设设计猫和老鼠做网站公司需要多少钱
  • 建设网站的费用如何入账网站建设评审
  • 网站建设公司软jian湖南岚鸿做微信文章的网站
  • 住房和城乡建设部网站防排烟长治市网上商城
  • 做网站放哪个科目做夜夜做网站
  • 电商网站图片网站建设服务费记账分录
  • 网站搭建公司案例网址wordpress纯手工注入