SpringBoot 之 事务管理
作者:互联网
我们在开发企业应用时,由于数据操作在顺序执行的过程中,线上可能有各种无法预知的问题,任何一步操作都有可能发生异常,异常则会导致后续的操作无法完成。此时由于业务逻辑并未正确的完成,所以在之前操作过数据库的动作并不可靠,需要在这种情况下进行数据的回滚。
注解 一般是在业务层实现类上或者其方法上假@transactional注解
SpringBoot默认有限选择CGL IB代理 如果想切换JDK代理也可以
SpringBoot中配置了自动注解注入 不需要自己开启事务
实现1
@Service public class FilmInfoServiceImpl implements IFilmInfoService { @Resource private FilmInfoMapper mapper; @Transactional @Override public int insert(FilminfoPO po) { //这里有异常的话就会回滚 return mapper.insert(po); }
Spring Boot 默认的事务规则是遇到运行异常(RuntimeException)和程序 错误(Error)才会回滚。
针对非运行时异常,如果要进行事务回滚的话,可以在 @Transactional 注解中使用 rollbackFor 属性来指定异常,比如 @Transactional(rollbackFor = Exception.class) ,这样就没有问题了,所以在实际项目中,一定要指定异常。
@Transactional(rollbackFor = Exception.class) @Override public void insert(FilminfoPO po) throws SQLException { // 手动抛出异常 mapper.insert(po); throw new SQLException("数据库异常"); }
如果异常在方法中被捕获 导致异常回滚失败 被try catch掉了 会认为没有异常 那么就会插入了 所以就不要在这里捕获 向上抛出异常
在调用该 service 的地方加锁,保证锁 的范围比事务的范围大即可
@Transactional(rollbackFor = Exception.class) @Override public synchronized void insert(FilminfoPO po) throws SQLException { // 手动抛出异常 mapper.insert(po); }
标签:事务管理,回滚,SpringBoot,insert,Transactional,异常,po,mapper 来源: https://www.cnblogs.com/ziwang520/p/16594272.html