为什么调用commit函数时SqlTransaction可能无法提交?

时间:2014-12-30 18:19:47

标签: c# sqltransaction

我遇到了一个问题,即使没有任何查询抛出异常,所做的更改也会被回滚。这很奇怪,因为代码在一个环境中工作,但不会在另一个环境中进行更改。

这是处理事务的函数。当我在提交上设置了一个断点时,我点击了提交,我可以看到数据库中的更改,但是当事务被处理时,更改将被回滚。

更新:其他测试表明,这不是交易的问题。如果事务从下面的代码中完全删除,则应用程序的行为方式相同。连接关闭时,更改将被撤消。

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;
            }
        }
    }
}

3 个答案:

答案 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)

此问题最终被追溯到最近更新为包含交易的触发器。

我们通过从触发器中删除事务来解决问题。