VB.NET - 事务回滚

时间:2013-01-15 21:07:12

标签: vb.net transactions

如果事务既未提交也未回滚,会发生什么情况。我正在寻找SQL Server和/或Oracle的答案。请参阅以下代码:

Public Sub TransactionTest()
        Try
            Dim intCount As Integer
            Dim sql As SqlTransaction
            Dim objCon As New SqlConnection("Data Source=IANSCOMPUTER;Initial Catalog=Test;Integrated Security=True;MultipleActiveResultSets=true")
            objCon.Open()
            Dim trans As SqlTransaction
            trans = objCon.BeginTransaction
            Dim paramValues(0) As SqlParameter
            paramValues(0) = New SqlParameter("@ID", 1)
            Using (objCon)
                intCount = SqlHelper.ExecuteNonQuery(trans, CommandType.Text, "UPDATE person SET URN=1 WHERE ID2=@ID", paramValues)
                paramValues(0) = New SqlParameter("@ID", 2)
                intCount = SqlHelper.ExecuteNonQuery(trans, CommandType.Text, "UPDATE person SET URN=2 WHERE ID2=@ID", paramValues)
                paramValues(0) = New SqlParameter("@ID", 3)
                intCount = SqlHelper.ExecuteNonQuery(trans, CommandType.Text, "UPDATE person SET URN=3 WHERE ID2=@ID", paramValues)
            End Using
        Catch ex As Exception
            'I do not swallow transactions
        End Try
    End Sub

请注意,它既未提交也未回滚。在上面的情况下,它似乎回滚。

我注意到在家里的SQL Server 2005 Express服务器上,SQL Studio Manager在控制台中直接运行查询时会挂起,直到上面的程序完成。在我的工作环境中,情况并非如此,即您可以同时运行查询。这是因为隔离级别吗?因此,我有两个问题:

  1. 如果事务既未提交也未回滚,会发生什么情况。我读过这样的文章:What happens if you don't commit transaction in a database (say SQL Server)。我可以假设事务是在SQL Server和Oracle中回滚的吗?
  2. 为什么SQL Server在事务处于活动状态时挂在一个环境中,而在另一个环境中却不挂起?
  3. 我正在寻找一个问题2的答案。

1 个答案:

答案 0 :(得分:1)

如果您不提交事务,数据库将在您关闭连接时将其回滚,假设您的代码发生了错误。这就是任何严肃的数据库的行为方式。

关于你的第二个问题,我想这与锁定有关,但如果不了解更多关于你的环境以及谁使用它们就很难说。