配置:在service层的具体方法上开启事务:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service public class InventoryServiceImpl implements InventoryService { @Autowired private DemoDao dao; @Override @Transactional public void add(Entity entity){ //TODO
dao.save(entity);
}
事务失效的原因可能有以下三个
- 异常相关
- 自己在方法内捕获了异常,但是没有抛出,这时候事务aop捕获不到异常,就不会执行回滚操作了。
- 解决:捕获处理异常后,再往外抛出
- 方法抛出了spring事务不处理的异常,spring事务默认只处理RuntimeException Error两种异常
- 解决:配置rollbackFor,指定事务捕获哪些异常
@Transactional(rollbackFor = Exception.class)
- 解决:配置rollbackFor,指定事务捕获哪些异常
- 自己在方法内捕获了异常,但是没有抛出,这时候事务aop捕获不到异常,就不会执行回滚操作了。
- 方法不是public
- 改呗
- 数据库表不是 innodb 引擎
- 如果是jpa自动生成的表,需要配置一下表的默认引擎(在配置文件中配置方言的方式已经被hibernate弃用,官方建议在环境信息或jvm中配置)
-
public static void main(String[] args) { //配置jpa生成表的默认引擎为innodb System.setProperty("hibernate.dialect.storage_engine","innodb"); SpringApplication.run(NikeDcProcessorApplication.class, args); }
-
- 如果是jpa自动生成的表,需要配置一下表的默认引擎(在配置文件中配置方言的方式已经被hibernate弃用,官方建议在环境信息或jvm中配置)