一、事务失效场景之一
非事务方法A中调用的自身类的事务方法B
在方法A中,我们处理了不同的任务,比如:①我们处理了网络传输相关的功能,上传视频、图片到服务器等 ②向数据库插入数据。这时,我们会想到在方法上加@Transactional注解,但是,由于上传视频等可能会用时很长。
因此,我们会将@Transactional注解添加到插入数据库相关的方法上(将其从方法中抽取出来,叫方法B),这时再在A中调用B,此时,如果B中发生异常,我们会发现,数据已经插入数据库了,事务失效了。
二、分析
因为事务起作用需要满足两个条件:①代理对象中调用方法②方法上加@Transactional注解。
上面A中调用B实际上是this调用,不是代理对象调用(注入的对象才叫代理对象),所以事务失效
三、解决方案
在类中自己注入自己,然后在A中用这个代理对象去调用B,还需要将B添加到service接口中,这样代理对象才能调用