说明
在JPAAS平台这种,有些地方需要使用分布式事务,实际上大部分的地方还是只需要本地事务。使用分布式事务的性能比本地事务差一些,因此我们本地事务和分布式事务可以一起来使用。
在程序中使用事务
原则当没有分布式事务的情况下,使用本地事务,在需要跨数据源和微服务时使用分布式事务。
使用本地事务
我们可以做一下测试。
@Transactional
public void taskLinkups(TaskLinkup taskLinkup) {
//业务代码
if(true){
throw new RuntimeException("自定义异常");
}
}
在日志中我们可以看到如下数据:
org.springframework.jdbc.datasource.DataSourceTransactionManager Creating new transaction with name [com.redxun.bpm.core.service.BpmTaskService.taskLinkups]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
org.springframework.jdbc.datasource.DataSourceTransactionManager Initiating transaction rollback
org.springframework.jdbc.datasource.DataSourceTransactionManager Rolling back JDBC transaction on Connection [io.seata.rm.datasource.ConnectionProxy@75b4d94]
org.springframework.jdbc.datasource.DataSourceTransactionManager Releasing JDBC Connection [io.seata.rm.datasource.ConnectionProxy@75b4d94] after transaction
在抛出异常时进行回滚。
使用分布式事务
在需要的方法上添加注解
@GlobalTransactional
public void taskLinkups(TaskLinkup taskLinkup) {
//业务代码
if(true){
throw new RuntimeException("自定义异常");
}
}
同样抛出自定义的异常。
我们看看日志:
//开启事务
io.seata.tm.TransactionManagerHolder TransactionManager Singleton io.seata.tm.DefaultTransactionManager@7467f494
io.seata.tm.api.DefaultGlobalTransaction Begin new global transaction [192.168.1.10:9999:2015844297]
org.mybatis.spring.SqlSessionUtils Creating a new SqlSession
//记录回滚日志
io.seata.rm.datasource.undo.AbstractUndoLogManager Flushing UNDO LOG
// 事务回滚
io.seata.rm.AbstractRMHandler Branch Rollbacked result: PhaseTwo_Rollbacked
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
io.seata.rm.AbstractRMHandler Branch Rollbacking: 192.168.1.10:9999:2015844297 2015844308 jdbc:mysql://localhost:3306/jpaas_bpm
io.seata.rm.datasource.undo.AbstractUndoLogManager xid 192.168.1.10:9999:2015844297 branch 2015844308, undo_log added with GlobalFinished
//事务回滚完毕
io.seata.tm.api.DefaultGlobalTransaction Suspending current transaction,xid = 192.168.1.10:9999:2015844297
io.seata.tm.api.DefaultGlobalTransaction [192.168.1.10:9999:2015844297] rollback status: Rollbacked
因此,我们在处理系统事务时,只有跨服务或数据源的时候,才需要开启分布式事务。
文档更新时间: 2022-03-12 14:35 作者:zyg