分布式事务

TC 如何知道哪些RM属于同一个全局事务?

以Seate框架为例,在TM向TC发送全局事务开始时,TC会生成对应的全局事务ID(XID),并发送给TM。TM 将 XID 放入当前线程的 ThreadLocal 中,后续的 RM (资源管理器) 分支事务通过解析该 XID 来注册分支。如果涉及RPC调用,每次调用时会在请求头部传递这个XID,让RM知道这个XID,RM向TC发送分支事务开始时,就会携带这个XID,从而告诉TC这个RM属于哪一个全局事务。

在多线程中,由于每个线程的XID是线程私有的,所以无法确定哪些RM属于同一个全局事务。这时全局事务会失效。解决方案可以是在开启新线程时,将XID传递给新线程,新线程的XID会继承父线程的XID。这样子线程的XID就会和父线程的XID一致,从而可以确定哪些RM属于同一个全局事务。

流程图片
流程图片