症状

假设正在运行 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 产品存在的问题。

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×