工具)
Tx是對(duì) SpringTransactionTemplate的輕量封裝用于執(zhí)行 JDBC、JPA、MyBatis 等命令式局部事務(wù)。源碼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;}}使用無(wú)返回值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));自定義事務(wù)Orderfoundtx.call(definition-{definition.setReadOnly(true);definition.setTimeout(5);},()-orderRepository.findById(id).orElseThrow());正常返回但回滾事務(wù)booleancreatedtx.call(status-{orderRepository.save(order);if(inventoryRepository.reserve(productId,quantity)0){status.setRollbackOnly();returnfalse;}returntrue;});說(shuō)明默認(rèn)傳播方式為REQUIRED有事務(wù)則加入沒(méi)有則新建。正常結(jié)束時(shí)提交拋出RuntimeException或Error時(shí)回滾。普通調(diào)用使用零參數(shù) Lambda只有主動(dòng)回滾或檢查狀態(tài)時(shí)才接收TransactionStatus。配置回調(diào)可設(shè)置傳播方式、隔離級(jí)別、超時(shí)、readOnly和事務(wù)名稱。readOnly是優(yōu)化提示不是強(qiáng)制寫(xiě)保護(hù)。事務(wù)不會(huì)自動(dòng)傳播到線程池、Async或新線程。R2DBC/Reactor 應(yīng)使用TransactionalOperator。