【发布时间】:2019-12-05 16:56:23
【问题描述】:
我有一个使用 .NET C# 运行的全天运行数据进程
在发生超时后尝试回滚事务时出现僵尸错误:
This SqlTransaction has completed; it is no longer usable.|System.InvalidOperationException: This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Rollback()
我的代码:
using (var transactionSql = connection.BeginTransaction())
{
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transactionSql))
{
try
{
// Updating table1
var commandUpd1 = new SqlCommand(query, connection, transactionSql);
commandUpd1.ExecuteNonQuery();
// Inserting table2
var commandInsert1 = new SqlCommand(query2, connection, transactionSql);
commandInsert1.ExecuteNonQuery();
// My bulk on table3
bulkCopy.WriteToServer(dataTable);
// Updating table1
var commandUpd2 = new SqlCommand(query3, connection, transactionSql);
commandUpd2.ExecuteNonQuery();
// Inserting table2
var commandInsert3 = new SqlCommand(query4, connection, transactionSql);
commandInsert3.ExecuteNonQuery();
transactionSql.Commit(); // Timeout
}
catch (Exception ex)
{
transactionSql.Rollback(); //Zombie error
throw ex;
}
}
}
僵尸错误有副作用。我执行的一些 sql 已提交。所以我有一个不受欢迎的状态。
我知道我可以做类似的事情来避免僵尸异常:https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqltransaction?redirectedfrom=MSDN&view=netframework-4.8
但这并不能解决数据库上不需要的持久化 sql。
为什么会出现这个错误?如何避免 sql 持久化在数据库中?
更新 1 根据要求,我的更新和插入 sql 发送了这样的日期:
...
var date = DateTime.Now.ToString("s");
public static void UpdateMethod(long id, int status, string date, SqlConnection connection, SqlTransaction transactionSql)
{
date = date == null ? "NULL" : $"'{date}'";
var query = $"UPDATE table SET Status = {status}, Date = {date} WHERE Id = {id}";
var commandUpdate = new SqlCommand(query, connection, transactionSql);
commandUpdate.ExecuteNonQuery();
}
谢谢
【问题讨论】:
-
stackoverflow.com/a/616841/1390548 -> 看看你有没有这样的日期时间转换。
-
添加了我的更新方法,发送一个日期...应该是问题吗?
-
您的日期字段可以为空吗?>
-
是的,它可以为空。
-
如果你得到了不受欢迎的状态,这意味着事务没有像你认为的那样工作。您的代码似乎表明您正在与其他代码共享连接对象。相反,您应该创建连接、开始事务、完成您的工作、提交/回滚、关闭。
标签: c# sql-server transactions sqlbulkcopy