说明

在JPAAS平台这种,有些地方需要使用分布式事务,实际上大部分的地方还是只需要本地事务。使用分布式事务的性能比本地事务差一些,因此我们本地事务和分布式事务可以一起来使用。

在程序中使用事务

原则当没有分布式事务的情况下,使用本地事务,在需要跨数据源和微服务时使用分布式事务。

使用本地事务

我们可以做一下测试。

  1. @Transactional
  2. public void taskLinkups(TaskLinkup taskLinkup) {
  3. //业务代码
  4. if(true){
  5. throw new RuntimeException("自定义异常");
  6. }
  7. }

在日志中我们可以看到如下数据:

  1. org.springframework.jdbc.datasource.DataSourceTransactionManager Creating new transaction with name [com.redxun.bpm.core.service.BpmTaskService.taskLinkups]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
  2. org.springframework.jdbc.datasource.DataSourceTransactionManager Initiating transaction rollback
  3. org.springframework.jdbc.datasource.DataSourceTransactionManager Rolling back JDBC transaction on Connection [io.seata.rm.datasource.ConnectionProxy@75b4d94]
  4. org.springframework.jdbc.datasource.DataSourceTransactionManager Releasing JDBC Connection [io.seata.rm.datasource.ConnectionProxy@75b4d94] after transaction

在抛出异常时进行回滚。

使用分布式事务

在需要的方法上添加注解

  1. @GlobalTransactional
  2. public void taskLinkups(TaskLinkup taskLinkup) {
  3. //业务代码
  4. if(true){
  5. throw new RuntimeException("自定义异常");
  6. }
  7. }

同样抛出自定义的异常。

我们看看日志:

  1. //开启事务
  2. io.seata.tm.TransactionManagerHolder TransactionManager Singleton io.seata.tm.DefaultTransactionManager@7467f494
  3. io.seata.tm.api.DefaultGlobalTransaction Begin new global transaction [192.168.1.10:9999:2015844297]
  4. org.mybatis.spring.SqlSessionUtils Creating a new SqlSession
  5. //记录回滚日志
  6. io.seata.rm.datasource.undo.AbstractUndoLogManager Flushing UNDO LOG
  7. // 事务回滚
  8. io.seata.rm.AbstractRMHandler Branch Rollbacked result: PhaseTwo_Rollbacked
  9. 2020-07-02 09:35:20.164 INFO io.seata.core.rpc.netty.RmMessageListener onMessage:xid=192.168.1.10:9999:2015844297,branchId=2015844308,branchType=AT,resourceId=jdbc:mysql://localhost:3306/jpaas_bpm,applicationData=null
  10. io.seata.rm.AbstractRMHandler Branch Rollbacking: 192.168.1.10:9999:2015844297 2015844308 jdbc:mysql://localhost:3306/jpaas_bpm
  11. io.seata.rm.datasource.undo.AbstractUndoLogManager xid 192.168.1.10:9999:2015844297 branch 2015844308, undo_log added with GlobalFinished
  12. //事务回滚完毕
  13. io.seata.tm.api.DefaultGlobalTransaction Suspending current transaction,xid = 192.168.1.10:9999:2015844297
  14. io.seata.tm.api.DefaultGlobalTransaction [192.168.1.10:9999:2015844297] rollback status: Rollbacked

因此,我们在处理系统事务时,只有跨服务或数据源的时候,才需要开启分布式事务。

文档更新时间: 2022-03-12 14:35   作者:zyg