【发布时间】:2015-06-18 01:56:04
【问题描述】:
我正在尝试将SqlCommand 的列表传递给持有与数据库的连接的成员函数。
public void CommitAsTransaction(List<SqlCommand> commands) {
SqlTransaction transaction = null;
SqlConnection connection = null;
try {
connection = this.CreateSqlConnection();
connection.Open();
transaction = connection.BeginTransaction("TransactionID");
foreach (SqlCommand cmd in commands) {
cmd.Transaction = transaction;
cmd.Connection = connection;
cmd.ExecuteNonQuery();
}
transaction.Commit();
}
catch (Exception ex) {
transaction.Rollback();
}
connection.Close();
}
这是我目前拥有的。发生错误是因为该命令似乎正在原地执行,并且从未到达 transaction.Commit();。我见过很多人这样做,但不确定我做错了什么。
PS:问题在于将要执行的存储过程必须全部在单个事务中运行,我无法控制它们并且它们是加密的,它们必须在事务中运行的原因是因为它们创建有 PK 要求的表中的临时记录。
【问题讨论】:
-
您说永远不会达到提交。会发生什么?
-
另外,我相信我会将连接和事务放入使用块中。
-
我得到一个 SQL 异常,指出它们是临时表上的主键约束,这意味着 SqlCommand 实际在服务器上执行。
-
您的 SQL 实例上配置了什么隔离级别?
-
事务并不意味着命令在提交之前不会执行 - 它们意味着命令会立即执行,但它们的 影响 不会在事务直到提交。
标签: c# sql-server sqlcommand sqltransaction