事务失效场景(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等不当传播机制时,虽然代码抛出异常,但数据库数据仍会被插入。