在spring项目中使用@Transactional注解标注的方法事务不生效,出现的场景原因可能有:
数据库不支持事务
事务生效的前提是你的数据源得支持事务,比如 mysql 的 MyISAM 引擎就不支持事务,而 Innodb 支持事务。
注解放在了私有方法上
简单来讲就是指非直接访问带注解标记的方法 B,而是通过类普通方法 A,然后由 A 访问 B。
**
* 非直接调用,不生效
*
* @param id
* @return
* @throws Exception
*/
@Transactional(rollbackFor = Exception.class)
public boolean testCompileException2(int id) throws Exception {
if (this.updateName(id)) {
this.query("after update name", id);
if (this.update(id)) {
returntrue;
}
}
thrownew Exception("参数异常");
}
public boolean testCall(int id) throws Exception {
return testCompileException2(id);
}
直接调用testCompileException2方法事务生效,直接调用testCall方法事务不生效。
类内部调用
在私有方法上,添加@Transactional注解也不会生效,私有方法外部不能访问,所以只能内部访问。
/**
* 私有方法上的注解,不生效
*
* @param id
* @return
* @throws Exception
*/
@Transactional
private boolean testSp