alwaysOn为什么不支持分布式事务

简介: Alwayson是微软从SQL2012开始引入的一种高可用和高性能架构,它既可以实现故障转移,同时又能实现查询分离,是当前SQL server的所有架构中最优秀的一种。

Alwayson是微软从SQL2012开始引入的一种高可用和高性能架构,它既可以实现故障转移,同时又能实现查询分离,是当前SQL server的所有架构中最优秀的一种。

因此,一般我们都会推荐使用AlwaysON来部署生产数据库,不过,尽管AlwaysON的优势非常明显,但并非适应于所有的业务场景。

AlwaysON不支持分布式事务和跨数据库事务

什么是分布式事务和跨数据库事务

分布式事务是指通过分布式事务协调器(MSDTC)的统一控制、将事务中的每个操作分解到多台主机上分别执行、每台主机执行成功后整个事务才能提交的事务,分布式事务协调器用来保证数据的一致性。跨数据库事务与此类似,只是不会用到MSDTC,而是将DBID最小的一个作为分布式事务协调器。

为什么AlwaysON不支持分布式事务

如果在一个分布式事务执行期间AlwaysON发生了故障转移,AG服务从主副本转移到了辅助副本,分布式事务协调器因为收不到原主副本的事务提交确认信息,认为事务执行失败,然后将其他参与(分布式事务的)节点上的应要提交的事务回滚。对于新的主副本,因为没有参与之前的分布式事务,因此无法从分布式事务协调器获取事务的状态,继续维持现有的数据不变化,从而导致新副本与参与分布式事务的其他节点上的数据不一致。

备注:跨数据库事务的原因与此类似。

下面我们通过图例来展示这个过程:

下图:假设有ABC三个节点,AC之间做了AlwaysON,其中A.table1中a的初始值为0,B.table1中a的初始值为1000。有一个分布式事务1,需要将节点A的表中a加上1000,同时需要在节点B的表中a减去1000。

1
2
3
4
5
6
7
BEGIN  TRAN
 
Update  A.table1  set  a=a+1000 ;
 
Update  B.table1  set  a=a-1000 ;
 
COMMIT  TRAN

正常情况下,最后的结果应该是A.table1.a=1000,B.table1.a=0,,C.table1.a=1000。

现在有这样一个场景,A和B都已经commit,A.table1.a=1000,B.table1.a=0,且A已经将事务1的操作通过日志同步到了主机C,C.table1.a=1000。

正常情况下,主机A和B都向事务协调器发送commit ack(提交确认)信息,事务协调器收到两者的确认信息后就可以将整个事务标记为提交。但现在A在发送commit ack信息时发生了宕机,分布式事务协调器只收到了主机B的commit ack,于是协调器将整个事务标记为失败,然后在主机B上回滚事务1的操作,此时B.table1.a=1000。

节点C虽然接管了AlwaysON集群,因为它并不是分布式事务的执行者之一,所以它无法从分布式事务协调器获取事务1的状态,因此它不会回滚,a的值保持不变。最后C.table1.a=1000、B.table1.a=1000,发生了数据不一致的问题。

clip_image002

参考文章:

http://blogs.msdn.com/b/alwaysonpro/archive/2014/01/06/not-supported-ags-with-dtc-cross-database-transactions.aspx;

https://msdn.microsoft.com/en-us/library/ms366279(v=sql.110).aspx;

AlwaysON的主副本使用传统的SQL Server故障转移集群

从上文可以看到,AlwaysON不支持分布式事务(和跨数据库事务)的根本原因在于主副本故障转移到辅助副本时会造成分布式事务执行不一致。

解决这个问题的焦点就是主副本和辅助副本的故障转移。如果主副本与辅助副本之间不允许故障转移(也就是处于异步同步模式下),辅助副本的职责只是接受来自主副本的日志,然后执行redo实现同步,这样一来就不会产生异常数据。

不过,主、辅副本无法故障转移后,主副本存在单点故障的风险,为了避免此类情况发生,我们可以为主副本建立传统的SQL Server故障转移集群。在这种架构下,如果主节点在执行分布式事务发生了故障转移,辅节点接管的SQL实例是原主节点的同一个实例,而且数据文件和日志文件是相同的,所以不会与其他参与分布式事务的节点产生数据不一致的问题。

clip_image004

目录
相关文章
|
6月前
|
数据库 数据安全/隐私保护
TiDB分布式事务处理机制
【2月更文挑战第28天】TiDB作为开源的分布式HTAP数据库产品,其分布式事务处理机制是其核心功能之一。本章节将深入解析TiDB分布式事务处理机制的工作原理,包括其采用的分布式事务协议、事务的提交与回滚过程、以及如何处理并发事务等关键内容。通过了解TiDB的分布式事务处理机制,我们可以更好地理解其在分布式环境下如何确保数据一致性和事务正确性。
|
6月前
|
大数据 数据库
数据库之分布式事务
数据库之分布式事务
47 0
|
Oracle 关系型数据库 MySQL
第四章:OceanBase集群技术架构(分布式事务、MVCC、事务隔离级别)
第四章:OceanBase集群技术架构(分布式事务、MVCC、事务隔离级别)
391 0
|
6月前
|
监控 关系型数据库 分布式数据库
【PolarDB开源】PolarDB故障恢复机制:快速恢复与数据一致性保障
【5月更文挑战第22天】阿里云PolarDB的故障恢复机制保证了云数据库的高可用性和一致性。通过ROW快照备份和增量日志,实现秒级备份和恢复,确保数据安全。日志分析快速定位故障,启用备用实例实现快速恢复。分布式事务和强一致性读等技术保障数据一致性。这套全面的解决方案使PolarDB在云原生数据库中表现出色。
580 10
|
5月前
|
监控 关系型数据库 分布式数据库
PolarDB故障恢复机制:快速恢复与数据一致性保障
【6月更文挑战第29天】**PolarDB云原生数据库的故障恢复机制确保高可用性与数据一致性。利用ROW快照备份实现秒级备份,结合Redo Log进行时间点恢复。通过日志分析定位故障,快速启动备用实例恢复服务。分布式事务及强一致性读保证数据完整性。PolarDB的高效恢复策略是其在云数据库市场中的关键优势。**
134 16
|
4月前
|
SQL 监控 安全
SQLserver AlwaysOn 提交模式与节点的可用性
【7月更文挑战第7天】SQL Server AlwaysOn中,提交模式影响节点可用性。主节点可配置为异步(始终异步提交)或同步。同步模式下,主节点与至少一个同步从节点一起提交,但若从节点超时或宕机,会退化为异步,可能导致数据丢失。`session_timeout`决定主副本等待辅助副本的时间。`required_synchronized_secondaries_to_commit`参数要求特定数量的同步副本。选择模式应基于业务需求、数据安全性和性能。监控节点状态、测试故障转移和备份策略至关重要。详情参考微软文档。
|
6月前
|
监控 NoSQL 容灾
MongoDB复制集原理:高可用性与数据一致性的保障
【4月更文挑战第30天】MongoDB复制集提供高可用性和数据一致性,通过在多个服务器间复制数据。复制集包含主节点和从节点,写操作在主节点执行,然后异步复制到从节点。优势包括故障切换、数据冗余、负载均衡和容灾备份。当主节点故障,其他节点会选举新主节点,确保服务连续性。配置复制集涉及规划节点、配置复制集、初始化和监控维护。复制集是实现数据库可靠性的核心。
|
6月前
|
存储 负载均衡 容灾
架构设计|基于 raft-listener 实现实时同步的主备集群
本文介绍如何从数据库内核角度建立一套实时同步的主备集群,确保线上业务的高可用性和可靠性。本系统采用双 AZ 主备容灾机制,并要求数据与 schema 实时同步,同步时延平均在 1 秒内,p99 在 2 秒内。此外,系统支持高效的自动或手动主备切换,并能在切换过程中恢复丢失数据。
97 0
|
关系型数据库
|
存储 SQL 负载均衡
【数据库架构】PostgreSQL的最佳群集高可用性方案
【数据库架构】PostgreSQL的最佳群集高可用性方案
下一篇
无影云桌面