在日常的开发中经常会遇到在线程池或者异常异步中执行自己的业务代码,lz最近在开发业务代码的时候也遇到一个类型的需求,因为请求处理的时间比较长,在设计接口的时候要求异步完成
直接上业务代码:
executeOccupyStock()方法也添加了事务
在运行是抛了异常 数据库未回滚,作为有多年开发的经验的Lz同学,此时心里一万句CNM。。
分析问题原因:
1.Spring的事务不支持跨线程 主要原因是spring的事务依赖当前线程的Connection对象 新建一个线程获取到的conection对象改变了 所以就不能支持进行提交或者回滚
2.虽然executeOccupyStock和sencodmentStockNotify在同一个spring bean中 但是不通过bean方式调用的话 apo不会进行拦截
综上所述 解决方案
1.将异步线程池操作 提到controller操作层
2.新建一个bean类 通过bean.method()的方式调用