MySQL的分布式(XA)事务

MySQL的分布式(XA)事务
  存储引擎的事务特性能够保证在存储引擎级别实现ACID(参考前⾯介绍的“事务”),⽽分布式事务则让存储引擎级别的ACID可以扩展到数据库层⾯,甚⾄可以扩展到多个数据库之间——这需要通过两阶段提交实现。MySQL5.0和更新版本的数据库已经开始⽀持XA事务了。
  XA事务中需要有⼀个事务协调器来保证所有的事务参与者都完成了准备⼯作(第⼀阶段)。如果协调器收到所有的参与者都准备好的消息,就会告诉所有的事务可以提交了,这是第⼆阶段。MySQL在这个XA事务过程中扮演⼀个参与者的⾓⾊,⽽不是协调者。
脱墨纸  实际上,在MySQL中有两种XA事务。⼀⽅⾯,MySQL可以参与到外部的分布式事务中;另⼀⽅⾯,还可以通过XA事务来协调存储引擎和⼆进制⽇志。
1.内部XA事务
琥珀酸二辛酯磺酸钠  MySQL本⾝的插件式架构导致在其内部需要使⽤XA事务。MySQL中各个存储引擎是完全独⽴的,彼此不知道对⽅的存在,所以⼀个跨存储引擎的事务就需要⼀个外部的协调者。如果不使⽤XA协议,例如,跨存储引擎的事务提交就只是顺序地要求每个存储引擎各⾃提交。如果在某个存储提交过程中发⽣系统崩溃,就会破坏事务的特性(要么就全部提交,要么就不做任何操作)。
自助式洗衣机
peepm  如果将MySQL记录的⼆进制⽇志操作看作⼀个独⽴的“存储引擎”,就不难理解为什么即使是⼀个存储引擎参与的事务仍然需要XA事务了。在存储引擎提交的同时,需要将“提交”的信息写⼊⼆进制⽇志,这就是⼀个分布式事务,只不过⼆进制⽇志的参与者是MySQL本⾝。
  XA事务为MySQL带来巨⼤的性能下降。从MySQL5.0开始,它破坏了MySQL内部的“批量提交”(⼀种通过单磁盘I/O操作完成多个事务提交的技术),使得MySQL不得不进⾏多次额外的fsync()调⽤。具体的,⼀个事务如果开启了⼆进制⽇志,则不仅需要对⼆进制⽇志进⾏持久化操作,InnoDB事务⽇志还需要两次⽇志持久化操作。换句话说,如果希望有⼆进制⽇志安全的事务实现,则⾄少需要做三次fsync()操作。唯⼀避免这个问题的办法就是关闭⼆进制⽇志,并将innodb_support_xa设置为0。
  但这样的设置是⾮常不安全的,⽽且这会导致MySQL复制也没法正常⼯作。复制需要⼆进制⽇志和XA事务的⽀持,另外——如果希望数据尽可能安全——最好还要将sync_binlog设置成1,这时存储引擎和⼆进制⽇志才是真正同步的。(否则,XA事务⽀持就没有意义了,因为事务提交了⼆进制⽇志却可能没有“提交”到磁盘。)这也是为什么我们强烈建议使⽤带电池保护的RAID卡写缓存:这个缓存可以⼤⼤加快fsync()操作的效率。
2.外部XA事务
玻璃退火窑  MySQL能够作为参与者完成⼀个外部的分布式事务。但它对XA协议⽀持并不完整,例如,XA协议
要求在⼀个事务中的多个连接可以做关联,但⽬前的MySQL版本还不能⽀持。发光管
  因为通信延迟和参与者本⾝可能失败,所以外部XA事务⽐内部消耗会更⼤。如果在⼴域⽹中使⽤XA事务,通常会因为不可预测的⽹络性能导致事务失败。如果有太多不可控因素,例如,不稳定的⽹络通信或者⽤户长时间地等待⽽不提交,则最好避免使⽤XA事务。任何可能让事务提交发⽣延迟的操作代价都很⼤,因为它影响的不仅仅是⾃⼰本⾝,它还会让所有参与者都在等待。
  通常,还可以使⽤别的⽅式实现⾼性能的分布式事务。例如,可以在本地写⼊数据,并将其放⼊队列,然后在⼀个更⼩、更快的事务中⾃动分发。还可以使⽤MySQL本⾝的复制机制来发送数据。我们看到很多应⽤程序都可以完全避免使⽤分布式事务。
  也就是说,XA事务是⼀种在多个服务器之间同步数据的⽅法。如果由于某些原因不能使⽤MySQL本⾝的复制,或者性能并不是瓶颈的时候,可以尝试使⽤。

本文发布于:2024-09-21 02:45:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/97791.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:事务   提交   引擎   进制
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议