0

如果事务既没有提交也没有回滚会发生什么。我正在寻找 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 管理器会挂起,直到上面的程序完成。在我的工作环境中,情况并非如此,即您可以同时运行查询。这是因为隔离级别吗?因此我有两个问题:

  1. 如果事务既没有提交也没有回滚会发生什么。我读过这样的文章:如果你不在数据库中提交事务会发生什么(比如 SQL Server)。我可以假设事务在 SQL Server 和 Oracle 中回滚吗?
  2. 为什么当事务处于活动状态时 SQL Server 在一个环境中挂起,而在另一个环境中却没有?

我正在专门寻找问题 2 的答案。

4

1 回答 1

1

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

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

于 2013-01-25T23:26:34.297 回答