数据库邮件未能在 SQL Server 中发送邮件时"不能再有效的事务处理"错误

症状

假设正在运行 Microsoft SQL Server 的用户无法将数据库邮件发送。在这种情况下,数据库邮件日志 (sysmail_event_log) 显示以下条目:

异常信息:

异常类型: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException 消息: 不能再有效的事务。 数据: System.Collections.ListDictionaryInternal TargetSite: 无效的 ValidateConnectionAndTransaction() HelpLink: 为空 来源: DatabaseMailEngine

StackTrace 信息:

在 Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnectionAndTransaction() 在 Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.RollbackTransaction() 在 Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.GetDataFromQueue (Int32 lifetimeMinimumSec DataAccessAdapter da) 在字符串 dbName、 字符串 dbServerName、 Int32 lifetimeMinimumSec、 loggingLevel 日志级别、 字节 [] 加密密钥 (Int32 connectionTimeout) 的 Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.ProcessQueueItems',@proc

备注:

  • "不能再有效"的短语将以此方式显示在邮件字段中表示的交易记录"将不再有效。"

  • 您可能会看到相同的应用程序日志中的消息。邮件将保留在"重试"状态,在 sysmail_unsentitems,和 DatabaseMail.exe 外部程序可以成功运行之前将保留未发送。

原因

SQL Server 默认连接选项使用设置 NUMERIC_ARITHABORT ON。当您运行sp_send_dbmail时,邮件排队到ExternalMailQueue。当一条消息出现在队列中时,激活存储过程触发器 DatabaseMail.exe 外部可执行文件。当DatabaseMail.exe连接到 SQL Server 时,它才能从队列中读取消息运行sp_readrequestSp_readrequest,在执行期间,您可能会注意到发生异常。

下面的 SELECT 语句运行在sp_readrequest (您需要收集以查看该 SELECT 语句的语句级跟踪):

数据库的数据库邮件的邮件 Id < ProcessId >< NTUserName >< SPID >< 开始时间 > msdb < LoginSid >< SessionLoginName > -网络协议: TCP/IP 上一组 quoted_identifier 关闭组 arithabort 在上设置 numeric_roundabort 上一组 ansi_warnings 上一组 ansi_padding 上一组 ansi_nulls 上一组 concat_null_yields_null 关闭组 cursor_close_on_commit 关闭组 implicit_transactions 设置语言 us_english 设置日期格式 mdy 设置 datefirst 7 设置事务隔离级别读取已提交 2-共用 1 1-非 DAC

RPC: 启动 < BinaryData > 4 < NTUserName > 数据库的数据库邮件的邮件 Id < ProcessId >< NTUserName >< SPID >< 开始时间 > sp_readrequest msdb < LoginSid >< SessionLoginName > exec sp_readrequest@receive_timeout = 600000

SP:StmtStarting< BinaryData > 4 < NTUserName > 数据库的数据库邮件的邮件 Id < ProcessId >< NTUserName >< SPID >< 开始时间 > sp_readrequest msdb < LoginSid >< SessionLoginName >

选择 @mailitem_id = MailRequest.Properties.value('(MailItemId) [1],int) 从 @xmlblob.nodes ( 声明命名空间的请求 ="http://schemas.microsoft.com/databasemail/requests"; / SendMail 的请求:) 作为 MailRequest(Properties)

如果设置 NUMERIC_ARITHABORT ON被设置为默认连接选项,此 SELECT 语句将遇到错误 1934年,将发生异常:

4 < 服务器名 > 数据库的数据库邮件的邮件 Id < ProcessId >< NTUserName >< SPID >< 异常开始时间 > 1934 msdb < LoginSid >< SessionLoginName >选择失败,因为包含以下设置选项不正确的设置: NUMERIC_ROUNDABORT。验证设置选项是否正确使用索引的视图和/或计算的列和/或过滤的索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作的索引。

当 DatabaseMail.exe 遇到异常时,回滚尝试但失败。异常会导致超出范围的交易记录。因此,数据库邮件日志中记录"事务处理不能有效"消息。

但是,问题的根源是由于不兼容的 SET 选项时发生错误 1934年当 XML 数据类型方法 (MailRequest.Properties.value('(MailItemId) [1],int)) 的 SELECT 语句中使用。

如何验证的错误消息

  • 检查数据库邮件日志中的错误消息是否相同的邮件 ("事务处理不能有效")。

  • 语句级事件,错误和警告,通过收集事件探查器跟踪和代理事件已启用。

  • 请检查 SQL Server 实例设置为默认连接选项。若要执行此操作,打开SQL Server 管理 Studio,右键单击服务器,然后再选择属性>连接>默认连接选项>数值舍入中止

解决方案

要解决此问题,请更改设置 NUMERIC_ROUNDABORT关闭默认连接选项。

状态

Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

谢谢您的反馈意见!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×