事务失效场景(2)
一、访问权限不是 public
Spring事务通过AOP动态代理实现,JDK动态代理要求目标方法必须是public。
问题原因:
- 当方法不是public时,会直接返回null,导致事务失效
解决方案:
- 确保方法为public
- 避免自调用
- 考虑使用AspectJ模式
二、数据库存储引擎不支持事务
MyISAM存储引擎不支持事务,而InnoDB完全支持ACID事务特性。
解决方案:
- 创建表时指定ENGINE=InnoDB
- 或使用ALTER TABLE命令转换现有表
三、注解配置错误(readOnly = true)
当设置readOnly = true时,尝试执行写操作会抛出异常:
“Connection is read-only. Queries leading to data modification are not allowed”
解决方案:
- 写操作方法应去掉readOnly属性或设置为false
四、事务超时时间过短
timeout参数设置过短会导致事务直接超时失效。
五、错误的传播机制
使用NOT_SUPPORTED等不当传播机制时,虽然代码抛出异常,但数据库数据仍会被插入。