事务的隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同事访问相同数据时,如果
没有采取必要的隔离机制,就可能发生以下的问题:
1、脏读:一个事务读取到另一个事务未提交的更新数据。
2、幻读:指当事务不是独立执行时发生的一种现象,例如:第一个事务对一个表中的数据进行了修改,这种修改涉及到
表中的全部行数据,同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生
操作第一个事务的用户发现表中还有没有修改的数据,就像发生了幻觉一样。
3、不可重复读:在一个事务内,多次读取到同一数据。在这个事务还没有结束时,另一个事务也访问了该同一数据。
那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一次事务两次读到的数据可能是不一样的。
这样在一个事务内两次读到的数据是不一样的,因此称为不可重复读。
分布式事务:指涉及到操作多个数据库的事务。其实就是将对同一库事务的概念扩大到对多个库的事务。
分布式事务的关键在于有一种方式知道事务在不同地方做的任何操作,提交或者回滚事务的决定必须产生统一的结果。
常规的操作就是引入一个协调者来统一调度所有分布式节点的执行。
分布式事务的一致性:为保证数据的高可用,通常,我们会将数据保留多个副本,这些副本会放在不同的物理机器上。
为了对用户提供正确的CURD等操作,我们需要保证这些放置在不同物理机器上的副本是一致的。
为了解决这种分布式一致性的问题,前人总结了许多典型的协议和算法,其中比较著名的有:二阶提交协议(two phase commitment protocal )、三阶提交协议(three phase commitment protocal )和paxos算法
DTP分布式事务模型(全称为Distributed Transaction Processing Reference Model),与DTP的XA规范(全称为Distributed Transaction Processing The XA Specification)的制定者是X/Open,即现在的Open Group
Open Group由IBM、ORACLE、PHILIPS、HUAWEI等公司组成,指定行业技术规范
X/Open 组织即 open group 定义了分布式事务的处理模型。
X/Open DTP(X/Open Distributed Transaction Processing Reference Model)基础组件 模型包括:
①应用程序 AP
②事务管理器TM 例如:交易中间件
③资源管理器RM 例如:数据库
④通信资源管理器CRM 例如:消息中间件
分布式事务处理的是全局事务。在一个DTP环境中,交易中间件是必须的,由它通知和协调相关数据库的提交或回滚,
而一个数据库只是将自己的操作影射到全局的事务中。
通常情况下,交易中间件与数据库通过XA 接口规范,使用两阶段提交来完成一个全局事务。具体过程描述如下:
二阶提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情况决定各参与
者是否要提交操作还是中断操作。
在第一阶段,交易中间件请求所有相关数据库准备提交(预提交)各自的事务分支,以确认是否所有相关数据库都可
以提交各自的事务分支。当某一数据库收到预 提交后,如果可以提交属于自己的事务分支,则将自己在该事务分支
中所做的操作固定记录下来,并给交易中间件一个同意提交的应答,此时数据库将不能再在该事 务分支中加入任何
操作,但此时数据库并没有真正提交该事务,数据库对共享资源的操作还未释放(处于上锁状态)。如果由于某种
原因数据库无法提交属于自己的 事务分支,它将回滚自己的所有操作,释放对共享资源上的锁,并返回给交易中间
件失败应答。
在第二阶段,交易中间件审查所有数据库返回的预提交结果,如所有数据库都可以提交,交易中间件将要求所有数据
库做正式提交,这样该全局事务被提交。而如果有任一数据库预提交返回失败,交易中间件将要求所有其它数据库回
滚其操作,这样该全局事务被回滚。
以一个全局事务为例,AP首先通知交易中间件开始一个全局事务,交易中间件通过XA接口函数通知数据库开始事务,
然后AP可以对数据库管理的资源进行操 作,数据库系统记录事务对本地资源的所有操作。操作完成后交易中间件通
过XA接口函数通知数据库操作完成。交易中间件负责记录AP操作过哪些数据库(事务 分支)。AP根据情况通知交
易中间件提交该全局事务,交易中间件会通过XA接口函数要求各个数据库做预提交,所有数据库返回成功后要求各
个数据库做正式提 交,此时一笔全局事务结束。
XA规范对应用来说,最大好处在于事务的完整性由交易中间件和数据库通过XA接口控制,AP只需要关注与数据库
的应用逻辑的处理,而无需过多关心事务的完整性,应用设计开发会简化很多。
三阶提交协议是二阶的升级版本,改进点在于:1、引入超时机制 2、将二阶的准备阶段再次一分为二 ,分为canCommit、preCommit、doCommit