遇到的问题
使用springBoot框架操纵mapper时,出现一个cannot execute UPDATE in a read-only transaction错误。然后将sql语句放到navicat执行,发现执行正常,但在程序中执行失败。
问题排查
暂且将调用的mapper称为aMapper,aMapper中有2个方法,一个aMethod与bMethod,其中A调用B方法,B方法执行数据库操作,加上了@Transactional注解,但是A没有加,这样才导致了cannot execute UPDATE in a read-only transaction错误。究其原因是:
同一个类中方法调用,导致@Transactional失效
开发中避免不了会对同一个类里面的方法调用,比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错误的一个地方。
那为啥会出现这种情况?其实这还是由于使用Spring AOP代理造成的,因为只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象来管理。
其中关于spring事务控制失效的详细介绍如下:
作者:程序员内点事
链接:https://juejin.im/post/5e72e97c6fb9a07cb346083f
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。