文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL 5.7中对XA支持的改进有哪些

2024-04-02 19:55

关注

这篇文章主要为大家展示了“MySQL 5.7中对XA支持的改进有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL 5.7中对XA支持的改进有哪些”这篇文章吧。

背景

    XA解决了当跨分布式资源情况下能在单个事务中保留ACID属性的问题。资源本身可以是其他MySQL服务器,甚至可以其他是不同的数据库技术。XA标准描述了全局事务管理器和本地资源管理器之间的交互。

    如引言中所述,MySQL 5.0引入了XA支持,从而增加了参与全局事务的能力。XA支持可以提供可访问事务资源的资源管理器和能够在全局事务中协调事务的事务管理器。MySQL的XA实现了让MySQL服务器来充当资源管理器,而连接到MySQL服务器的客户端执行事务管理器的任务。

    XA使用两阶段提交协议,其中第一阶段是发出commit请求,然后再进行实际的commit。全局事务的各个分支完成执行后,将启动两阶段提交协议:

  1. 在第一阶段,事务管理器向全局事务中涉及的所有分支发出准备commit的消息。在资源管理器确认已准备好提交之前,它会将操作的记录结果记录并保存,为第二阶段执行实际的提交做准备。

  2. 在第二阶段,事务管理器如果从所有涉及的分支接收到确定的响应,则通知它们提交。但是,如果任何一个分支的答复为否,则会通知所有分支执行回滚。

        一个事务管理器与多个资源管理器进行交互,以处理全局事务中的单个事务/分支。以下图描述了涉及一个资源管理器中的XA事务。XA事务的语句以XA关键字,要执行的操作和唯一标识符开头。在下面的示例中,字符串“ xatest”表示全局事务标识符。除了全局事务标识符之外,还可以为XA事务指定分支标识符和格式ID。分支标识符用于标识本地事务,格式ID指定前两个组件使用的格式。

MySQL 5.7中对XA支持的改进有哪些

XA START / BEGIN 启动事务并定义其全局事务标识符。
XA END 指定活动事务的结束。
XA PREPARE 为事务的COMMIT做准备。
XA COMMIT [ONE PHASE] COMMIT并结束一个已PREPARE的事务。
如果使用“单阶段”选项,则准备和提交将在结束事务的单个步骤中执行。
XA ROLLBACK  回滚并终止事务。
XA RECOVER显示有关所有PREPARED事务的信息。

让我们看一下上述XA事务的状态之间转换。

MySQL 5.7中对XA支持的改进有哪些


XA START将事务置于活动状态。一旦所有语句由活动事务执行后,就会发出XA_END语句,使该事务处于IDLE状态。对于空闲事务,可以发出XA PREPAREXA COMMIT ONE PHASE。XA PREPARE将事务置于PREPARED状态。但是,XA COMMIT ONE PHASE会准备并提交事务。对于PREPARED XA事务,将发出XA COMMIT提交以结束事务。

已解决主要问题。

在5.7.7之前,如果客户端连接终止或服务器正常退出,则回滚PREPARED事务。当客户端被杀死时,所有交易都会回滚。因此,即使XA事务处于PREPARED状态,它也无法在XA RECOVER期间恢复该事务。理想情况下,在准备事务时,应该可以提交或回滚该事务。对于这种情况,让我们看一下 错误12161中报告的 示例。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

mysql> CREATETABLEt1(fld1INT);

QueryOK, 0 rowsaffected (0.01 sec)

 

mysql> COMMIT;

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> INSERTINTOt1VALUES (1);

QueryOK, 1 rowaffected (0.00 sec)

 

mysql> XAEND 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> Killed

 

Nowstartanotherclientsession.

 

mysql> XA 'test';

 1397 (XAE04): XAER_NOTA: UnknownXID

 

mysql> XARECOVER;

Emptyset (0.00 sec)

同样在5.7.7之前,如果XA事务处于PREPARED状态且服务器异常退出,则可以在重新启动服务器后恢复该事务-但不会复制该事务。  服务器重新启动后,XA事务仍将以PREPARED状态存在,但其内容无法记录在二进制日志中。因此,二进制日志不同步,导致数据漂移。因此,XA不能安全地用于复制。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

mysql> CREATETABLEt1(fld1INT);

QueryOK, 0 rowsaffected (0.01 sec)

 

mysql> COMMIT;

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> INSERTINTOt1VALUES (1);

QueryOK, 1 rowaffected (0.00 sec)

 

mysql> XAEND 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

Nowkilltheserver.

 

mysql> XARECOVER;

 

 2006 (HY000): MySQLserverhasgoneaway

Noconnection. Tryingto reconnect...

Connectionid: 1

Currentdatabase: test

 

+----------+--------------+--------------+------+

| formatID | gtrid_length | bqual_length | data |

+----------+--------------+--------------+------+

| 1        | 4            | 0            | test |

+----------+--------------+--------------+------+

1 rowin set (0.02 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.02 sec)

 

mysql> SHOWBINLOGEVENS\G;

*************************** 1. row ***************************

Log_name: nisha-PORTEGE-Z30-A-bin.000001

Pos: 4

Event_type: Format_desc

Server_id: 1

End_log_pos: 120

Info: Serverver: 5.6.29-debug-log, Binlogver: 4

1 rowin set (0.00 sec)

 

mysql> SELECT * FROMt1;

+------+

| fld1 |

+------+

| 1 |

+------+

1 rowin set (0.00 sec)

overcoming the above mentioned restrictions required changes in the XA transaction recovery mechanism and  binary logging mechanism.  This improvement was made in 5.7.7 through the implementation of work log number  7193 and  6860/  bug 12161.

Let us look at the output of the above examples after 5.7.7:

为了克服上述限制,需要对XA事务恢复机制和二进制日志记录机制进行更改。通过执行工作日志编号 7193和 6860 /  bug 12161在5.7.7中进行了改进。

让我们看看5.7.7之后的上述示例的输出:

客户端断开连接后:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

mysql> CREATETABLEt1(fld1INT);

QueryOK, 0 rowsaffected (0.01 sec)

 

mysql> COMMIT;

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> INSERTINTOt1VALUES (1);

QueryOK, 1 rowaffected (0.00 sec)

 

mysql> XAEND 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> Killed

 

Nowstartanotherclientsession.

 

mysql> XARECOVER;

+----------+--------------+--------------+------+

| formatID | gtrid_length | bqual_length | data |

+----------+--------------+--------------+------+

|        1 |            4 |            0 | test |

+----------+--------------+--------------+------+

1 rowin set (0.00 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.02 sec)

服务器重启后:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

mysql> CREATETABLEt1(fld1INT);

QueryOK, 0 rowsaffected (0.01 sec)

 

mysql> COMMIT;

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> INSERTINTOt1VALUES (1);

QueryOK, 1 rowaffected (0.00 sec)

 

mysql> XAEND 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.00 sec)

 

Nowkilltheserver.

 

mysql> XARECOVER;

 

 2006 (HY000): MySQLserverhasgoneaway

Noconnection. Tryingto reconnect...

Connectionid: 1

Currentdatabase: test

 

+----------+--------------+--------------+------+

| formatID | gtrid_length | bqual_length | data |

+----------+--------------+--------------+------+

| 1        | 4            | 0            | test |

+----------+--------------+--------------+------+

1 rowin set (0.02 sec)

 

mysql> XA 'test';

QueryOK, 0 rowsaffected (0.02 sec)

 

mysql> SHOWBINLOGevents\G;

*************************** 3. row ***************************

Log_name: nisha-PORTEGE-Z30-A-bin.000001

Pos: 154

Event_type: Anonymous_Gtid

Server_id: 0

End_log_pos: 219

Info:  @@SESSION.GTID_NEXT= 'ANONYMOUS'

*************************** 4. row ***************************

Log_name: nisha-PORTEGE-Z30-A-bin.000001

Pos: 219

Event_type: Query

Server_id: 0

End_log_pos: 319

Info: XA '74657374','',1

*************************** 5. row ***************************

Log_name: nisha-PORTEGE-Z30-A-bin.000001

Pos: 319

Event_type: Query

Server_id: 0

End_log_pos: 418

Info: use `test`; INSERTINTOt1VALUES (1)

*************************** 6. row ***************************

Log_name: nisha-PORTEGE-Z30-A-bin.000001

Pos: 418

Event_type: Query

Server_id: 0

End_log_pos: 509

Info: XAEND '74657374','',1

*************************** 7. row ***************************

Log_name: nisha-PORTEGE-Z30-A-bin.000001

Pos: 509

Event_type: XA_prepare

Server_id: 0

End_log_pos: 549

Info: XA '74657374','',1

*************************** 8. row ***************************

   Log_name: nisha-PORTEGE-Z30-A-bin.000002

        Pos: 219

 Event_type:  Server_id: 0

End_log_pos: 313

       Info: XA '74657374','',1

8 rowsin set (0.00 sec)

以上是“MySQL 5.7中对XA支持的改进有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯