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

江西合创建设工程有限公司 网站wordpress 产品展示主题

江西合创建设工程有限公司 网站,wordpress 产品展示主题,企业网站优化,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.yayakq.cn/news/202064/

相关文章:

  • 免费织梦网站源码下载网站建设-纵横网络
  • 展览制作设计公司百度竞价优化
  • 网站排名怎么弄vps建两个网站要两个程序池吗
  • 外贸营销网站制作网站设计制作培训
  • 自学网页设计的网站jquery 手机网站开发
  • 电子商务查询网站关键词数据分析
  • 济宁专业网站制作公司网站关键词符号
  • 网站建设添加展示栏网站开发协议书
  • dw中旅游网站怎么做阿里云网站
  • 婚纱摄影网站定制建设微信网站的流程
  • 网站不备案可以用吗网站地图seo
  • 公路机电工程建设网站广告投放代理商加盟
  • 中国建设银行邵阳分行网站简洁wordpress 杂志
  • 射阳住房和建设局网站wordpress阅读积分
  • 电子商务网站建设与维护 答案企业邮箱哪家便宜
  • 重庆网站建设重庆零臻科技行响应式网站建设服务提供商
  • 杭州公司网站建设哪家好百度SEO网站
  • 网站设计与实现作业杭州网络公司
  • 法律网站开发wordpress模板怎么更换
  • 搜索引擎的网站有哪些制作简单的网页的软件
  • 网站图片尺寸网站开发实践实验教程
  • 中企网络科技建站网站建设及维护招聘
  • 开展网站建设暴雪被收购
  • 爱站seo网站后台管理模板html
  • 南京市建筑工程网站东莞网站优化
  • 北京市网站建设企业wordpress如何上传附件
  • 怎么做网站才能不被仿冒自己建个网站需要多少钱
  • 秦皇岛网站制作方案商城网站建设报价方案
  • 济南专业网站制作定制公交app
  • 免费培训学校网站源码莱芜网站建设怎么样