|
8 | 8 | |
9 | 9 | ##### 2.XA协议成员 |
10 | 10 | <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/711607681004_.pic_hd.jpg" width = "600" height = "240" alt="图片名称" align=center /> |
| 11 | + |
11 | 12 | > - 应用程序(Application Program ,简称 AP):用于定义事务边界(即定义事务的开始和 结束),并且在事务边界内对资源进行操作。 |
| 13 | +> |
12 | 14 | > - 资源管理器(Resource Manager,简称 RM):如数据库、文件系统等,并提供访问资源 的方式 |
| 15 | +> |
13 | 16 | > - 事务管理器(Transaction Manager ,简称 TM):负责分配事务唯一标识,监控事务的执行 进度,并负责事务的提交、回滚等。 |
14 | 17 |
|
15 | 18 | ##### 3.XA协议接口 |
16 | 19 | <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/721607681013_.pic_hd.jpg" width = "400" height = "450" alt="图片名称" align=center /> |
| 20 | + |
17 | 21 | ###### 3.1XA也是2PC(两阶段)的,第一阶段(xa_start、xa_end),第二阶段(xa_prepare、xa_commit、xa_rollback) |
18 | 22 | > - xa_start :负责开启或者恢复一个事务分支 |
| 23 | +> |
19 | 24 | > - xa_end: 负责取消当前线程与事务分支的关联 |
| 25 | +> |
20 | 26 | > - xa_prepare:询问 RM 是否准备好提交事务分支 |
| 27 | +> |
21 | 28 | > - xa_commit:通知 RM 提交事务分支 |
| 29 | +> |
22 | 30 | > - xa_rollback: 通知 RM 回滚事务分支 |
| 31 | +> |
23 | 32 | > - xa_recover : 需要恢复的 XA 事务 |
24 | 33 |
|
25 | 34 | ##### 4.Mysql中对XA协议的支持 |
26 | 35 | ###### 4.1 MySQL 从5.0.3开始支持InnoDB引擎的 XA 分布式事务,MySQL Connector/J 从5.0.0版本开始支持XA。(Mysql5.7以下版本XA是不安全的,如Mysql5.6断开SQL连接后,XA会自动回滚,导致无法重连补偿) |
27 | | - <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/731607681029_.pic_hd.jpg" width = "800" height = "220" alt="图片名称" align=center /> |
| 36 | + <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/731607681029_.pic_hd.jpg" width = "800" height = "220" alt="图片名称" align=center /> |
28 | 37 |
|
29 | 38 | ###### 4.2 在 DTP 模型中,MySQL 属于资源管理器(RM)。分布式事务中存在多个 RM,由事务管理器 TM 来统一进行协调。 |
30 | | - <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/741607681043_.pic_hd.jpg" width = "800" height = "180" alt="图片名称" align=center /> |
| 39 | + <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/741607681043_.pic_hd.jpg" width = "800" height = "180" alt="图片名称" align=center /> |
31 | 40 |
|
32 | 41 | ##### 5 MySQL XA事务状态 |
33 | | - <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/751607681057_.pic_hd.jpg" width = "800" height = "500" alt="图片名称" align=center /> |
| 42 | + <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/751607681057_.pic_hd.jpg" width = "800" height = "500" alt="图片名称" align=center /> |
| 43 | + |
34 | 44 | > - SQL执行完成后进入XA_END状态 |
| 45 | +> |
35 | 46 | > - XA_END状态可以进入XA_PREPARE状态 |
| 47 | +> |
36 | 48 | > - XA_PREPARE状态可以进入XA_COMMIT和XA_ROLLBACK状态 |
| 49 | +> |
37 | 50 | > - XA事务和本地事务的开启是互斥的,不能同时进行 |
38 | 51 |
|
39 | 52 | ##### 6 XA事务失败了怎么办? |
40 | 53 | > - **业务SQL执行过程中,某个RM崩溃怎么处理?** |
| 54 | +> |
41 | 55 | > 如果在start和end阶段报错,还未到prepare阶段,TM会回滚全部XA事务. |
| 56 | +> |
42 | 57 | > - **全部prepare后,某个RM崩溃怎么处理?** |
| 58 | +> |
43 | 59 | > TM等待RM恢复后,重新连接,再次提交. |
| 60 | +> |
44 | 61 | > - **commit时,某个RM崩溃时如何处理?** |
| 62 | +> |
45 | 63 | > 没有好办法,通过Recover重试或人工. |
46 | 64 |
|
47 | 65 | ##### 7 XA协议可能会存在的问题 |
48 | 66 | > - **同步阻塞问题** |
| 67 | +> |
49 | 68 | > 多台Mysql中Commit的速度是不一致的,在多个XA事务并发的场景下可能会存在脏数据 |
| 69 | +> |
50 | 70 | > 如果一定要保证全局事务一致性,需要调整隔离级别为串行话(Serializable) |
| 71 | +> |
51 | 72 | > - **数据不一致** |
| 73 | +> |
52 | 74 | > 极端情况下,一定有事务失败问题,需要监控和人工处理 |
53 | 75 |
|
54 | 76 | ------------ |
55 | 77 |
|
56 | 78 | ### 二.XA框架 |
57 | 79 | ##### 目前XA应用较为广泛的是Atomikos框架 |
58 | | - <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/761607681074_.pic_hd.jpg" width = "800" height = "320" alt="图片名称" align=center /> |
| 80 | + <img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/761607681074_.pic_hd.jpg" width = "800" height = "320" alt="图片名称" align=center /> |
59 | 81 |
|
60 | 82 | ### 三.Atomikos-XA框架实战 |
61 | 83 | ##### 1.SQL准备工作,创建两个数据库和相应的表结构 |
|
0 commit comments