为什么 SqlTransaction 被僵尸化了

时间:2021-06-07 18:22:59

标签: .net sql-server .net-core

我有一个 SqlTransaction 来执行一些操作,首先删除数据,然后用 SqlBulkCopy 插入。有时会发生 SqlTransaction 在处理一段时间后将 Connection 设置为 null 并且尝试使用 SqlBulkCopy 插入更多行导致错误的情况:

<块引用>

事务要么与当前连接无关 或已完成

当我查看源代码时,当交易被僵尸化时有一个内部状态,我的交易可能进入了这个状态。

有什么办法可以找出交易进入这种状态的原因吗?

例外:

<块引用>

事务要么与当前连接无关 或已完成。在 System.Data.SqlClient.SqlBulkCopy.CreateOrValidateConnection(String 方法)在 System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken) 在 System.Data.SqlClient.SqlBulkCopy.WriteToServerAsync(DataRow[] 行, CancellationToken 取消令牌)

1 个答案:

答案 0 :(得分:0)

我尝试在 SqlConnection 上打开日志信息消息

CurrentConnection = new SqlConnection(theConnectionString);
CurrentConnection.Open();
CurrentConnection.FireInfoMessageEventOnUserErrors = true;
CurrentConnection.InfoMessage += CurrentConnection_InfoMessage;


private void CurrentConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    var errors = new List<string>();
    if (e.Errors != null)
    {
        for (int i = 0; i < e.Errors.Count; i++)
        {
            errors.Add(e.Errors[i].ToString());
        }
    }

    _logger.LogEvent($"SQL connection info message: source={e.Source}, message={e.Message}, errors={string.Join(',', errors)}");
}

结果出现了僵局

<块引用>

SQL 连接信息消息:source=Core .Net SqlClient Data Provider, message=事务(进程 ID 134)因锁定而死锁 | 与另一个进程的通信缓冲区资源已被 被选为僵局受害者。重新运行事务。

相关问题