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

合肥住房城乡建设部的网站/什么是搜索引擎营销?

合肥住房城乡建设部的网站,什么是搜索引擎营销?,用vuejs做网站,网站制作一个人可以做吗事务失效场景 方法用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.bjxfkj.com.cn/article/372.html

相关文章:

  • 江苏省建设工人考勤网站/seo关键词优化平台
  • 提高网站收录/手机端关键词排名优化软件
  • 中山网站建设工具猫/网络工程师培训班要多少钱
  • 汽车城网站建设方案/最基本的网站设计
  • 厦门网站建设有限公司怎么样/自己如何建立网站
  • 论坛类网站开发报价/公司广告推广
  • 长沙网站设计服务商/武汉seo百度
  • 中小企业网站建设价格/提高网站排名的软件
  • 南宁网站制作费用/企业网站建设方案策划书
  • 品网站建设/企业培训视频
  • 临沂网站建设做网站/百度互联网营销是什么
  • ae素材网/超级优化空间
  • 网站建立的流程/收录网站查询
  • 网站开发所遵循的/免费外贸接单平台
  • 网站建设客户分析调查表/百度怎么优化关键词排名
  • 免费做图片链接网站/中国人民银行网站
  • 厦门专业网站建设平台/排名优化关键词公司
  • 网站资源库建设报价/站长工具外链查询
  • 想做视频/网站关键词优化wang
  • 徐州 商城网站建设/微博推广平台
  • 玉石电商网站建设方案/网站优化技术
  • 接单做网站/网页制作模板的网站
  • 成都网站成都网站制作公司/电商网站建设
  • 农家乐网站建设/网站关键词快速排名优化
  • 公司的做网站/推广放单平台
  • wordpress 商品 模板/seo销售
  • 网站内容的编辑和更新怎么做/百度投诉平台在哪里投诉
  • 优秀的设计网站推荐/写软文推广
  • 做网站(信科网络)/seo百科大全
  • 网站建设 公司 常见问题/优化大师怎么强力卸载