Spring中三种编程式事务的使用
- 引入事务管理器
@Autowired
TransactionTemplate transactionTemplate;
@Autowired
PlatformTransactionManager transactionManager;
使用方式1:
boolean result = transactionTemplate.execute(new TransactionCallback<Boolean>() { @Override public Boolean doInTransaction(TransactionStatus status) { try { // TODO something } catch (Exception e) { //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动开启事务回滚 status.setRollbackOnly(); logger.error(e.getMessage(), e); return false; } return true; } });
使用方式2:
/** * 定义事务 */ DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setReadOnly(false); //隔离级别,-1表示使用数据库默认级别 def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction(def); try { //TODO something transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); throw new InvoiceApplyException("异常失败"); }
使用方式3:
SqlSession sqlSession = null; try { sqlSession = otInvSqlSessionFactory.openSession(ExecutorType.BATCH, true); XXXXXMapper xXxxMapper = sqlSession.getMapper(XXXXXMapper.class);
Savepoint savepointStep1 = sqlSession.getConnection().setSavepoint();
sqlSession.getConnection().rollback(savepointStep1); sqlSession.commit(); }catch(Exception e){ if (null != otInvSqlSession) { sqlSession.rollback(true); logger.error("数据回滚", e); } }finally { if (null != sqlSession) { sqlSession.clearCache(); sqlSession.close(); } }
注:单从实现角度来看,读提交每次都需要遍历所有后端活跃进程得到已提交事务号,而可重复读只要在事务一开始获取一次,因为大部分事务都包含多个语句,可重复读应该性能高于读提交。但实际确实读提交性能远远高于可重复度,这值得深究。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!