iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 5.7中对XA支持的改进有哪些
  • 342
分享到

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

2024-04-02 19:04:59 342人浏览 八月长安
摘要

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

这篇文章主要为大家展示了“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.

  • The XA recovery mechansim has been extended such that when a connection is terminated, the PREPARED XA transactions are left in the transaction cache and marked specially in InnoDB. This allows the client to RECOVER the PREPARED XA transactions and then COMMIT/ ROLLBACK.

  • The XA transactions are now binlogged in two phases using two different GTIDs which allows the transactions to be interleaved.  During the first phase, when XA PREPARE is issued, the transaction up until that point is logged in the binary log and can be identified by XA_prepare_log_event. During the second phase, when XA COMMIT/ROLLBACK is issued, the second part of the transaction is written into the binary log. Since XA PREPARE is persistent,  the XA transaction is not rolled back and survives  the server restart or client disconnect. The client can perform XA COMMIT/ROLLBACK and the binary log remains up to date. XA transactions also works well when GTID is ON and binary log is turned OFF.

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

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

  • XA恢复机制已得到扩展,以便在终止连接时,将PREPARED XA事务保留在事务缓存中,并在InnoDB中进行特殊标记。这允许客户端恢复PREPARED XA事务,然后执行COMMIT / ROLLBACK。

  • 现在,使用两个不同的GTID在两个阶段对XA事务进行二进制记录,从而可以使事务交织。在第一阶段中,当发出XA PREPARE时,直到该点的事务都会记录在二进制日志中,并且可以通过以下方式进行标识:XA_prepare_log_event. 第二阶段中,当发出XA COMMIT / ROLLBACK时,将事务的第二部分写入二进制日志。由于XA PREPARE是持久性的,因此XA事务不会回滚,并且可以在服务器重新启动或客户端断开连接后继续存在。客户端可以执行XA COMMIT / ROLLBACK,并且二进制日志保持最新。当GTID设置为ON并且二进制日志设置为OFF时,XA事务也可以很好地工作。

让我们看看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支持的改进有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 5.7中对XA支持的改进有哪些

本文链接: https://www.lsjlt.com/news/62643.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL 5.7中对XA支持的改进有哪些
    这篇文章主要为大家展示了“MySQL 5.7中对XA支持的改进有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL 5.7中对XA支持的改进有哪些”这...
    99+
    2024-04-02
  • javascript支持的对象有哪些
    本篇内容主要讲解“javascript支持的对象有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript支持的对象有哪些”吧! ...
    99+
    2024-04-02
  • Mysql支持的数据类型有哪些
    这篇文章将为大家详细讲解有关Mysql支持的数据类型有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.数值类型Mysql支持所有标准SQL中的数值类型,其中包括严格...
    99+
    2024-04-02
  • MySQL安装支持的平台有哪些
    这篇文章主要讲解了“MySQL安装支持的平台有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL安装支持的平台有哪些”吧!<table cl...
    99+
    2024-04-02
  • Kotlin中支持的泛型有哪些
    Kotlin中支持的泛型有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。例如,泛型类:class Hello<T>(val value: T)val box =...
    99+
    2023-05-31
    kotlin 泛型
  • mysql中5.6与5.7有哪些区别
    今天小编给大家分享一下mysql中5.6与5.7有哪些区别的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2024-04-02
  • HTML5中不支持的标签有哪些
    这篇文章将为大家详细讲解有关HTML5中不支持的标签有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、HTML5不支持或不赞成使用的标签<acronym>...
    99+
    2024-04-02
  • vuejs支持的事件有哪些
    本篇内容介绍了“vuejs支持的事件有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • css3支持的滤镜有哪些
    这篇文章主要为大家展示了“css3支持的滤镜有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css3支持的滤镜有哪些”这篇文章吧。 ...
    99+
    2024-04-02
  • Redis中支持的数据类型有哪些
    这篇文章将为大家详细讲解有关Redis中支持的数据类型有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis支持五种数据类型:string(字符串),hash(哈...
    99+
    2024-04-02
  • Debian中有哪些支持的硬件架构
    Debian支持的硬件架构包括: x86(32位和64位) AMD64/Intel 64(64位) ARM(包括armel,arm...
    99+
    2024-03-12
    Debian
  • 对C++11特性支持的C编译器有哪些
    今天就跟大家聊聊有关对C++11特性支持的C编译器有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。GCC的下个版本是4.8,以及Clang即将到来的版本是3.3 。如果你使用Vi...
    99+
    2023-06-17
  • Java中支持的字符编码有哪些
    这期内容当中小编将会给大家带来有关Java中支持的字符编码有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 概述在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB23...
    99+
    2023-05-31
    java 字符编码 ava
  • Bootstrap支持的JavaScript插件有哪些
    本篇内容介绍了“Bootstrap支持的JavaScript插件有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够...
    99+
    2024-04-02
  • thinkphp支持的数据库有哪些
    本篇内容介绍了“thinkphp支持的数据库有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!thinkphp支持的数据库有MySql、M...
    99+
    2023-06-22
  • PostgreSQL 12中的改进有哪些
    本篇内容主要讲解“PostgreSQL 12中的改进有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL 12中的改进有哪些”吧!“Auto...
    99+
    2024-04-02
  • navicat支持的数据库有哪些
    这篇文章主要介绍了navicat支持的数据库有哪些,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。  Navicat是一套快速、可靠并价格相宜的数...
    99+
    2024-04-02
  • ie9支持的css3属性有哪些
    这篇文章主要介绍“ie9支持的css3属性有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ie9支持的css3属性有哪些”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • ubuntu支持的处理器有哪些
    ubuntu支持的处理器有ARM和X86架构处理器。ubuntu在原则上是可以支持电脑、服务器、平板、手机等等各类X86和ARM处理器的电子设备,对于ARM处理器而言,目前开发工作量比较大,以及ARM处理器移植难度比X86要高,并且目前支持...
    99+
    2024-04-02
  • 支持jsp的服务器有哪些
    支持JSP的服务器有很多,以下是几个常用的服务器:1、Apache Tomcat是一个开源的Web应用服务器,支持JSP和Servl...
    99+
    2023-05-16
    支持jsp的服务器 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作