摘要:MySQL从5.0.3版本就开始支持分布式事务,并且只有InnoDB存储引擎支持分布式事务。一个分布式事务涉及到多个事务性的活动,这些活动都必须一起完成或者一起被回滚。然而MySQL的分布式事务技术还在建设中,存在一定的漏洞。本文介绍MySQL在分布式事务中的应用并对其漏洞进行浅析。
下载论文网 http://www.xzlunwen.com
关键词:分布式事务;数据库;MySQL
中图分类号:TP311.13 文献标识码:A 文章编号:1007-9599 (2011) 23-0000-01
MySQL-based Applications and Defects of Distributed Affairs
Men Wei
(China University of Mining&Technology,School of Computer Science&Technology,Xuzhou 221116,China)
Abstract:Distributed Transaction has been supported by MySQL since the 5.0.3 version,and It is only be supported by InnoDB storage engine.A distributed transaction is referred to many transactional activities,and these activities must be finished together,otherwise,they will be rolled back together.However,the technology of Distributed Transaction in MySQL is under construction and it has also some bug.This paper will introduce the use of Distributed Transaction in MySQL and analyse the bugs simply.
Keywords:Distributed Affairs;Database;MySQL
一、分布式事务概述
(一)分布式事务的概念和用途
分布式事务的事务参与者、资源管理器、事务管理器等位于不同的节点上,这些不同的节点相互协作共同完成一个具有逻辑完整性的事务。本文主要介绍的是MySQL在分布式事务中的应用与漏洞分析。
分布式事务的主要作用在于确保事务的一致性和完整性。它利用分布式的计算环境,在TP系统的支持下,将多个事务性的活动合并成一个事务单元,这些事务性的活动要么一起执行,要么都不执行,从而保证了多个活动之间的一致性和完整性。
(二)分布式事务的相关概念
1.资源管理器(Resource Manager):资源管理器管理系统资源,是通向事务资源的途径。数据库就是一种资源管理器。资源管理还应该具有管理事务提交或回滚的能力。
2.事务管理器(Transaction Manager):事务管理器是分布式事务的核心管理者。事务管理与每个RM进行通信,协调并完成事务的处理。事务的各个分支是由某种命名方法进行标识。
二、MySQL中分布式事务模型对照和执行过程分析
MySQL在执行分布式事务(XA MySQL)的时候,MySQL服务器相当于XA事务资源管理器,与MySQL链接的客户端相当于事务管理器。要执行一个分布式事务,首先知道分布式事务涉及到哪些资源管理器,并且把每一个资源管理器中的事务执行到事务可以被提交叫或者回滚。通常使用两阶段提交法:(1)第一阶段,所有的分支被预备好。它们被Transaction-Manager告知要准备提交。每个分支Resource-Manger记录分支的行动并指示任务的可行性。而这些结果被用于第二阶段。(2)第二阶段,TM告知RMs是否要提交或者回滚。如果预备分支的时候各个分支都可行,那么就确认提交,如果有一个分支出错,那么就要全部回滚。特殊情况下,只有一个分支的时候,第二阶段则被省略。
三、MySQL中分布式事务的漏洞分析
考虑特殊情况:当一个事务分支处在PREPARE状态的时候失去了链接,在服务器重启以后虽然能看到为提交的事务,但是PREPARE之后的操作(包括提交或者回滚)没有写入binlog。这导致事务部分丢失或者主从数据库不一致。失败的例子如下:
SessionA SessionB
从student表中查找id为2的学生,结果集为空:
mysql>select * from student where id=2; 从student表中查找id为2的学生,结果集为空:
mysql>select * from student where id=2;
启动事务test:mysql>xa start ‘test’,’TA’;
加入一条记录并查看:mysql>insert into student values(2,’tomcat’,’003’);
mysql>xa prepare ‘test’,’TA’;
mysql>select * from student where id=2;
name:id tomcat:2 查询刚才的记录,显示结果为空:
mysql>select * from student where id=2;
完成第一阶段,进入PREPARE状态。
mysql>xa prepare ‘test’,’TA’;
SessionA突然异常终止 查询分布式事务的状态:
MySQL>xa recover/G
formatID:1 gtrid_length:4 bqual_length:2
SessionA被回滚 SessionA被回滚后,sessionB无法查看sessionA插入的记录,此时如果SessionB事务已被提交,则会导致分布式事务不完整。
四、结束语
MySQL虽然从5.0.3版本就开始支持了分布式事务,但是在特殊情况下是无法保证事务的完整性。主要原因就是在PREPARE状态的分支事务在遇到异常时没有记录到binlog,从而破坏了MySQL的日志恢复机制。MySQL也在不断完善中,将来或许通过日志机制改进来修复分布式事务中的漏洞。
参考文献:
[1]唐汉明.深入浅出MySQL[M].人民邮电出版社,2008
[2]萨师煊,王珊.数据库系统概论[M].高等教育出版社,2000,2
[3]郑振楣,于戈.分布式数据库[M].科学出版社,1999