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

网站建设经济可行性b2c有哪些电商平台

网站建设经济可行性,b2c有哪些电商平台,兰州企业 网站建设,辽阳低价网站建设公司事务失效场景 方法用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.khdw.cn/news/8947.html

相关文章:

  • 怎么自己创建一个网站芜湖网络营销公司
  • 免费做网站txt外链厦门关键词排名优化
  • 安卓手机应用开发福州网站优化公司
  • 中国最好的网站制作公司百度一下 官方网
  • 县 两学一做网站网络推广服务合同
  • h5 响应式网站国外免费加客源软件
  • 做交易网站什么开发语言网络广告营销的案例
  • 网站建设合同补充内容营销策划公司是干什么的
  • 深圳公司手机网站制作抖音优化排名
  • 学校网站类型免费发布推广的平台
  • 美国客户打不开我们的网站百度引流免费推广怎么做
  • 建设网站商城后台系统百度主页网址
  • 学校网站建设报价电脑系统优化软件十大排名
  • 万江区仿做网站网络营销有哪些例子
  • 南阳做网站网店运营在哪里学比较好些
  • 深圳网站建设珠江广场网络热词2022
  • 微网站趋势在线葡京在线葡京
  • 政府网站建设指引企业线上培训平台有哪些
  • 无锡哪家网站做的好上海还能推seo吗
  • 微信网站开发多少钱太原网站建设方案咨询
  • 社交网站模板下载3d建模培训学校哪家好
  • 怎样做知道网站网络营销研究现状文献综述
  • 长沙企业建站按效果付费网络公司seo推广
  • 工程建设招标网都有哪些网站东莞网站制作推广公司
  • 云南网站建设企业推荐一键生成网页
  • 深圳网络推广最新招聘网站优化搜索排名
  • 做中英文网站网络营销的种类有哪些
  • 中国农村建设投资有限公司网站社交媒体营销
  • 专注河南网站建设武汉seo公司出 名
  • 网站建设公司一月赚多少如何做好网站的推广工作