我有一个 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 取消令牌)
答案 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)因锁定而死锁 | 与另一个进程的通信缓冲区资源已被 被选为僵局受害者。重新运行事务。