翻译自:https://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_txns003.htm#ADMIN12222
不像在本地数据库的事务,分布式数据库涉及到在多个数据库中改变数据,因此,分布式事务处理更加复杂,因为数据库间必须协调保证整个事务的原子性,即要不全部成功,要不全部失败。
事务一旦提交,无法回滚
数据保证数据的完整性的方式是使用两阶段提交(XA Transaction),第一阶段称为准备阶段,事务协调器(也称初始节点)询问参与本次事务的数据库是否保证本次事务中归它们管的部分能够保证原子性,即如果事务失败,它们能够回滚。
所有参与分布式事务的节点执行相同的动作,它们或者全部提交或者全部回滚。数据库能够保证这一点通常不需要应用编写者做任何事情。
Phase Description
准备阶段参与者节点收到全局协调者的询问,会做如下动作:
日志(redo log)里面记录此次事务元信息,以备回滚锁住表,防止读当然,参与者节点只是被动地去接收回滚或者成功的请求,而不主动做决定。
当然参与者节点收到询问会给事务协调者响应,分三种,本次事务不涉及本数据库更改返回Read-Only.
事务协调者,全局协调者指的都是一个意思
事务协调者要求提交者节点提交提交者节点提交提交者节点通知事务协调者已经提交全局协调者和本地协调者(提交者节点)要求所有节点提交事务(属于各自部分)所有节点提交属于自己部分的事务并释放表锁本文所有事务状态信息都记入redo log
记录redo log日志表示事务已经提交 缺点和优点 优点优点当然是传统DB只支持在单个数据库上执行事务,而XA 2PC协议支持在多个数据库上执行事务
缺点缺点是2PC是阻塞式的,参与全局事务的数据库被动听从事务管理器的命令,执行或放弃事务,如果运行事务管理器的机器宕机,那整个系统就不能用了。
另外还可能影响其他系统,如果事务管理器挂了,但是这个数据库的表锁还没释放,因为数据库还在等待事务管理器的命令,因此,使用这个数据库的其他应用也会收到影响。