2

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

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

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

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

3 回答 3

0

虽然我很确定,但我在最后尝试了您的代码,它按预期工作。我再次重申,该方法对于事务处理来说已经足够好了。并且事务一旦提交,就无法回滚。

在上述方法中,事务处理与任何回滚无关。我想,你一直在错误的方向调试。不过,您可以在此处粘贴原始方法,因为您可能正在执行一些其他数据库操作。

只是出乎意料,您一直在发出什么样的查询?请注意,DDL 命令是自动提交的,事务不会生效。

于 2014-12-31T13:46:15.060 回答
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 会话并查看导致数据恢复的原因。听起来好像有一些单独的东西正在触发以恢复该场景中的数据。

如果数据未提交,则根据其他评论,您有某种事务计数不匹配。

于 2015-01-12T03:21:25.567 回答
0

这个问题最终被追溯到最近更新为包含事务的触发器。

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

于 2015-08-12T08:05:02.437 回答