Tx:局部事务工具

发布时间:2026/10/28 18:41:01
Tx:局部事务工具 Tx是对 SpringTransactionTemplate的轻量封装用于执行 JDBC、JPA、MyBatis 等命令式局部事务。源码packageio.github.idoly.utils;importjava.util.function.Consumer;importjava.util.function.Supplier;importorg.springframework.stereotype.Component;importorg.springframework.transaction.PlatformTransactionManager;importorg.springframework.transaction.TransactionStatus;importorg.springframework.transaction.annotation.Propagation;importorg.springframework.transaction.support.DefaultTransactionDefinition;importorg.springframework.transaction.support.TransactionCallback;importorg.springframework.transaction.support.TransactionTemplate;ComponentpublicfinalclassTx{privatefinalPlatformTransactionManagertransactionManager;publicTx(PlatformTransactionManagertransactionManager){this.transactionManagertransactionManager;}publicvoidrun(Runnableaction){run(ignored-action.run());}publicvoidrun(ConsumerTransactionStatusaction){newTransactionTemplate(transactionManager).executeWithoutResult(action);}publicvoidrun(Propagationpropagation,Runnableaction){run(propagation,ignored-action.run());}publicvoidrun(Propagationpropagation,ConsumerTransactionStatusaction){run(definition-definition.setPropagationBehavior(propagation.value()),action);}publicvoidrun(ConsumerDefaultTransactionDefinitioncustomizer,Runnableaction){run(customizer,ignored-action.run());}publicvoidrun(ConsumerDefaultTransactionDefinitioncustomizer,ConsumerTransactionStatusaction){createTemplate(customizer).executeWithoutResult(action);}publicTTcall(SupplierTaction){returncall(ignored-action.get());}publicTTcall(TransactionCallbackTaction){returnnewTransactionTemplate(transactionManager).execute(action);}publicTTcall(Propagationpropagation,SupplierTaction){returncall(propagation,ignored-action.get());}publicTTcall(Propagationpropagation,TransactionCallbackTaction){returncall(definition-definition.setPropagationBehavior(propagation.value()),action);}publicTTcall(ConsumerDefaultTransactionDefinitioncustomizer,SupplierTaction){returncall(customizer,ignored-action.get());}publicTTcall(ConsumerDefaultTransactionDefinitioncustomizer,TransactionCallbackTaction){returncreateTemplate(customizer).execute(action);}privateTransactionTemplatecreateTemplate(ConsumerDefaultTransactionDefinitioncustomizer){TransactionTemplatetemplatenewTransactionTemplate(transactionManager);customizer.accept(template);returntemplate;}}使用无返回值tx.run(()-{accountRepository.debit(sourceId,amount);accountRepository.credit(targetId,amount);});有返回值Ordersavedtx.call(()-orderRepository.save(order));指定传播方式importstaticorg.springframework.transaction.annotation.Propagation.REQUIRES_NEW;tx.run(REQUIRES_NEW,()-auditRepository.save(event));自定义事务Orderfoundtx.call(definition-{definition.setReadOnly(true);definition.setTimeout(5);},()-orderRepository.findById(id).orElseThrow());正常返回但回滚事务booleancreatedtx.call(status-{orderRepository.save(order);if(inventoryRepository.reserve(productId,quantity)0){status.setRollbackOnly();returnfalse;}returntrue;});说明默认传播方式为REQUIRED有事务则加入没有则新建。正常结束时提交抛出RuntimeException或Error时回滚。普通调用使用零参数 Lambda只有主动回滚或检查状态时才接收TransactionStatus。配置回调可设置传播方式、隔离级别、超时、readOnly和事务名称。readOnly是优化提示不是强制写保护。事务不会自动传播到线程池、Async或新线程。R2DBC/Reactor 应使用TransactionalOperator。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询