当前位置: 首页 > 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.hkea.cn/news/754017/

相关文章:

  • 个人风采网站制作外贸网站平台哪个好
  • 沈阳企业建站谷歌推广和seo
  • .la域名做的网站如何快速推广app
  • 广州优化网站建设怎么用手机制作网站
  • 做微网站的第三方学网络营销
  • 湖南做网站的公司有哪些搜索引擎是什么
  • flash网站管理系统seo优化排名易下拉用法
  • 永年网站建设友链互换平台推荐
  • 企业网站的设计公司网络广告营销的典型案例
  • 高校思政主题网站建设的意义关键词歌词任然
  • 哪里做网站比较快2345网址导航下载桌面
  • 广州建设委员会官方网站凡科建站下载
  • 全球做网站的公司排名百度一下你就知道官网
  • 小企业网站价格免费发链接的网站
  • 买了空间和域名 怎么做网站哪家公司网站做得好
  • 网站备案是否关闭衡阳网站建设公司
  • 遂昌建设局网站个人怎么做网站
  • 软件开发和网站建设网络营销的未来6个发展趋势
  • 做网站一年多少钱免费seo网站推广
  • 智通人才网东莞最新招聘信息官网seo是如何做优化的
  • 个人做跨境电商网站百度地图导航手机版免费下载
  • 阿里云注册网站之后怎么做网站百度联盟是什么
  • 动画制作视频河南网站排名优化
  • 网站关键词怎么做排名掌门一对一辅导官网
  • 现在什么网站做推广比较好网页设计需要学什么
  • 个人购物网站 怎么建网络营销包括
  • 有没有做鸭的网站工作室招聘广州网站优化工具
  • 深圳营销外深圳网络营销公司seo和sem的联系
  • 专业的网站制作公司哪家好竞价专员是做什么的
  • 海南省建设厅网站百度seo霸屏软件