我遇到了一个问题,即使没有任何查询抛出异常,所做的更改也会被回滚。这很奇怪,因为代码在一个环境中工作,但不会在另一个环境中进行更改。
这是处理事务的函数。当我在提交上设置了一个断点时,我点击了提交,我可以看到数据库中的更改,但是当事务被处理时,更改将被回滚。
更新:其他测试表明,这不是交易的问题。如果事务从下面的代码中完全删除,则应用程序的行为方式相同。连接关闭时,更改将被撤消。
public bool Transaction(List<string> sqlStatements)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlTransaction tran = conn.BeginTransaction())
{
try
{
foreach (string query in sqlStatements)
{
SqlCommand cmd = new SqlCommand(query, conn, tran);
cmd.CommandTimeout = 300;
cmd.ExecuteNonQuery();
}
tran.Commit();
return true;
}
catch (SqlException sqlError)
{
tran.Rollback();
//Log Exception
return false;
}
}
}
}
答案 0 :(得分:0)
虽然我确定,但我在我的最后尝试了你的代码,它按预期工作。我再次重申,该方法对于事务处理来说已经足够了。一旦提交了事务,它就无法回滚。
在上述方法中,事务处理与任何回滚无关。我想,你一直在调试方向错误。但是,您可以在此处粘贴原始方法,因为您可能正在执行其他一些数据库操作。
只是出了蓝色,你一直在解雇什么样的问题?请注意,DDL命令是自动提交的,事务将无效。
答案 1 :(得分:0)
当您说“可以看到数据库中的更改”时,您是如何确定的?如果以下查询返回“已提交”的数据(例如,在执行Sql Server Management Studio中的提交调用后运行此tsql),我希望它们“在数据库中”:
-- Force the isolation level to "read committed" so we
-- guarantee we are getting data that has definitely been committed.
-- If the data changes back, it must have been from a separate operation.
set transaction isolation level read committed
begin tran
select * from MyTableWithExpectedChanges;
-- You aren't changing anything so this can be rollback or commit
rollback tran
如果确实提交了数据,我将运行SQL Server Profiler会话并查看导致数据还原的原因。听起来像是单独的东西触发了恢复该场景中的数据。
如果数据未提交,则根据其他评论,您会遇到某种事务计数不匹配。
答案 2 :(得分:0)
此问题最终被追溯到最近更新为包含交易的触发器。
我们通过从触发器中删除事务来解决问题。