跨线程事务说明
最后更新:2024-09-14 23:34:55
|
状态:未完成
与线程内事务不同的是,事务信息保存在一个全局mpa变量中(ApplicationConnectionHolder)
在启动事务时,需要设置事务有效范围TransactionDefine.MODE.APPLICATION
并提供事务ID(也可以随机生成)这个ID需要与其他纯种共用,所以一般根据业务主键生成,如流程ID
第二个线程也要设置事务有效范围,也使用相同ID启动事务,如发现当前ID事务已存在,则加入当前事务,如果不存在则新启动一个事务
在启动事务(DefaultTransactionManage.start)时,会获取相关数据源的连接
获取数据源连接过程:根据数据源和事务ID到全局同map中查找,如果存在,则复用,没有再调用连接池获取新连接,并把新连接存入全局map
无论是否是新连接都存入当前线程的ThreadLocal中,因为后面操作数据库时要根据ThreadLocal获取连接(注意不是到全局map中,因为这时没有事务ID)
提交或回滚事务时,因为提供了事务定义参数,所以直接从事务定义中获取连接提交或回溯,
再把ThreadLocal和全局map中的数据删除
在启动事务时,需要设置事务有效范围TransactionDefine.MODE.APPLICATION
并提供事务ID(也可以随机生成)这个ID需要与其他纯种共用,所以一般根据业务主键生成,如流程ID
第二个线程也要设置事务有效范围,也使用相同ID启动事务,如发现当前ID事务已存在,则加入当前事务,如果不存在则新启动一个事务
在启动事务(DefaultTransactionManage.start)时,会获取相关数据源的连接
获取数据源连接过程:根据数据源和事务ID到全局同map中查找,如果存在,则复用,没有再调用连接池获取新连接,并把新连接存入全局map
无论是否是新连接都存入当前线程的ThreadLocal中,因为后面操作数据库时要根据ThreadLocal获取连接(注意不是到全局map中,因为这时没有事务ID)
提交或回滚事务时,因为提供了事务定义参数,所以直接从事务定义中获取连接提交或回溯,
再把ThreadLocal和全局map中的数据删除