症状
假设在 Microsoft SQL Server 2016 或 2017 中至少有一个具有 DTC_SUPPORT=PER_DB 的 AlwaysOn 可用性组。 如果执行的 SQL Server 触发器包含涉及至少一个可用性组数据库的跨数据库事务,则可能会发生断言失败。 SQL Server 错误日志报告以下断言失败消息:
DateTime spid20s * *******************************************************************************
日期时间 spid20s * 开始堆栈转储:
日期时间 spid20s * 位置: 文件名:3880
DateTime spid20s * Expression: m_state == BaseXact::XACT_PREPARED ||m_state == BaseXact::XACT_COMMITTED
日期时间 spid20s * SPID:20
日期时间 spid20s 错误:17066,严重性:16,状态:1。
DateTime spid20s SQL Server 断言:文件:<FileName>, line=LineNumber 失败 断言 = 'm_state == BaseXact::XACT_PREPARED || m_state == BaseXact::XACT_COMMITTED'。 此错误可能与计时有关。 如果重新运行语句后错误仍然存在,请使用 DBCC CHECKDB 检查数据库的结构完整性,或重启服务器以确保内存中数据结构未损坏。
日期时间 spid20s 错误:3624,严重性:20,状态:1。
日期时间 spid20s 系统断言检查失败。 查看 SQL Server 错误日志了解详细信息。 断言失败通常是由软件 bug 或数据损坏导致的。 若要检查数据库损坏,请考虑运行 DBCC CHECKDB。 如果你同意在安装过程中向 Microsoft 发送转储,则将向 Microsoft 发送一个小型转储。 更新可能来自 Microsoft 的最新服务包或技术支持的修补程序中提供。
此外,你可能会收到类似以下内容的错误消息:
DateTime 服务器错误:19407,严重性:16,状态:1。
DateTime服务器 可用性组 “GroupName” 与 Windows Server 故障转移群集之间的租约已过期。 SQL Server 实例与 Windows Server 故障转移群集之间发生连接问题。 若要确定可用性组是否正确故障转移,请检查 Windows Server 故障转移群集中相应的可用性组资源。
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。
解决方法
累积更新信息:
此问题已在 SQL Server 的以下累积更新中修复:
关于 SQL Server 的累积更新:
SQL Server 的每个新累积更新都包含上一个累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
按需修补程序信息:
此问题已在以下 SQL Server 按需修补程序中修复:
参考资料
了解 Microsoft 用于描述软件更新的术语。