简单解决你的事务回滚问题
事务 解决 简单 回滚 问题
2023-09-27 14:29:12 时间
/** * 用户登录接口 * * * 1明确事务方法前的命名规则 * 2保证事务方法执行的时间尽可能的短,不允许出现循环操作,不允许出现RPC等网络请求操作 * 3不允许所有的方法都使用事务,节省服务器性能和缩短数据库连接时间 * 4如果出现有多个地方需要事务回滚时,使用自定义或原有的异常进行抛出,异常必须继承RunTimeError,否则不会触发回滚操作 * 5使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚 * */ @Transactional public UserModel login(UserModel user){ UserModel userEntity = new UserModel(); userEntity = userDao.login(user); if(userEntity == null) { return null; } userEntity = userDao.login(user); if(userEntity == null) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return null; } else { return userEntity; } }
直接给出一个例子代码,上面只是记录一下,下面才是干货。
首先很多时候我们不会采用事务操作,但是当我们在一个服务层多次访问数据库特别是进行插入删除操作的时候,我们需要使用事务进行操作,也就是一个不成功,所有的操作全部回滚。
那么具体的事务特性我就不多说了,规范我也打在最上面的注释里面了。主要注意一下,
使用@Transactional 注解
如果第一次插入成功,第二次插入失败,执行TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 这条语句之后,第一次的插入动作就被回滚了,也就是并没有生效。
手动回滚看起来会比较实用一些。
然后对于抛出异常的那种自动回滚可以参考百度各种代码。比较麻烦一些,就不列举了。
补充一下:
使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
设置回滚点,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。
设置回滚点,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。
后序补充详细属性配置(复杂)
相关文章
- 分布式事务面试题 (史上最全、持续更新、吐血推荐)
- 8 -- 深入使用Spring -- 6...1 Spring支持的事务策略
- 【转】视图、索引、存储过程 、触发器、游标及事务
- 《备战金九银十》之分布式事务篇
- Spring事务失效的 8 大原因
- 《SQL入门经典(第5版)》一一6.3 事务控制与数据库性能
- 孙玄:微服务架构中分布式事务实现方案如何取舍
- SpringMvc整合Mybatis并使用声明式事务
- (4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务)
- (2.5)备份与还原--事务日志的物理及逻辑结构
- 事务日志的截断与收缩
- SQL事务用法begin tran,commit tran和rollback tran的用法