
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。