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

目录
相关文章
|
存储 缓存 固态存储
存储性能的关键指标:IOPS与吞吐量详解
【4月更文挑战第21天】
4241 0
|
存储 Java 关系型数据库
LDAP统一认证服务解决方案
LDAP统一认证服务解决方案
1168 1
|
设计模式 编解码 前端开发
打造卓越 QML 层级设计:从入门到精通(三)
打造卓越 QML 层级设计:从入门到精通(三)
1820 0
|
4月前
|
测试技术 Swift 开发者
可调节推理预算,字节Seed团队开源大型语言模型 Seed-OSS 系列!
字节跳动 Seed 团队正式发布了 Seed-OSS 系列开源大型语言模型,提供强大的长上下文、推理、代理和通用功能,以及对开发者友好的多功能特性。
527 9
|
SQL 数据库
传递给数据库 'model' 中的日志扫描操作的日志扫描号无效
原文:传递给数据库 'model' 中的日志扫描操作的日志扫描号无效 状况描述:在服务器的管理中重新启动MSSQLSERVER启动后马上又停止   通过"事件查看器" 发现 错误: 9003,严重度: 20,状态: 1 LSN(5:324:1)无效。
3661 0
|
5月前
|
人工智能 缓存 监控
智能体性能优化:延迟、吞吐量与成本控制
作为一名深耕AI领域多年的技术博主摘星,我深刻认识到智能体(AI Agent)性能优化在当今人工智能应用中的关键地位。随着大语言模型和智能体技术的快速发展,如何在保证服务质量的前提下优化系统性能、控制运营成本,已成为每个AI从业者必须面对的核心挑战。在我多年的实践经验中,我发现许多团队在部署智能体系统时往往只关注功能实现,而忽视了性能优化的重要性,导致系统在高并发场景下响应缓慢、成本居高不下,最终影响用户体验和商业价值。本文将从性能瓶颈识别与分析、模型推理优化技术、缓存策略与并发处理、成本效益分析与优化四个维度,系统性地探讨智能体性能优化的核心技术和最佳实践。通过深入分析延迟(Latency)
620 0
智能体性能优化:延迟、吞吐量与成本控制
|
JSON 前端开发 JavaScript
前端使用lottie-web,使用AE导出的JSON动画贴心教程
前端使用lottie-web,使用AE导出的JSON动画贴心教程
1949 2
|
存储 前端开发 测试技术
MVC、MVP、MVVM 模式
MVC、MVP 和 MVVM 是三种常见的软件架构模式,用于分离用户界面和业务逻辑。MVC(Model-View-Controller)通过模型、视图和控制器分离数据、界面和控制逻辑;MVP(Model-View-Presenter)将控制逻辑移到 Presenter 中,减少视图的负担;MVVM(Model-View-ViewModel)通过数据绑定机制进一步解耦视图和模型,提高代码的可维护性和测试性。