Tx:局部事务工具

发布时间:2026/8/23 22:49:26
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。