MYSQL Transaction.Rollback failed



我最近一直在Visual Basics中实现一个请求序列,并希望在某些失败时回滚。因此,我做了如下:

Public Class DAO
    Dim connection As New MysqlConnection
    Dim command As New MySqlCommand
    Dim dr As MySqlDataReader
    Dim transaction As MySqlTransaction
    Public Sub New()
        connection = New MySqlConnection(`MYDATA_FROM_DATABASE`)
        connection.Open()
        transaction = connection.BeginTransaction
        command.Connection = connection
        command.Transaction = transaction
    End Sub
    Public Sub Rollback()
        System.Diagnostics.Debug.WriteLine(Me.GetType.Name & " - Rollback")
        Try
            transaction.Rollback()
            connection.Close()
            System.Diagnostics.Debug.WriteLine("Rollback success")
        Catch
            System.Diagnostics.Debug.WriteLine("Rollback failed - " & ex.Message)
        End Try
    End Sub
    Public Sub Close()
        System.Diagnostics.Debug.WriteLine(Me.GetType.Name & " - Closing")
        Try
            transaction.Commit()
            connection.Close()
            System.Diagnostics.Debug.WriteLine("Commit success")
        Catch ex As Exception
            System.Diagnostics.Debug.WriteLine("Commit failed - " & ex.Message)
        End Try
    End Sub
End Class

有了这个,我创建了其他DAOS类,继承了那个类。其他类还有其他方法,例如:

Public Class UserDAO
    Inherits DAO
    Public Function Insere(name As String) As Boolean
        Try
            command.commandText = "INSERT INTO User(Name) VALUES('" & name & "')"
            command.ExecuteNonQuery
            Return True
        Catch
            Return False
        End Try
    End Function 
End Class

而且,例如,我想插入 3 个用户,如果它出现错误,我会撤消所有内容:

假设方法位于代码的任何其他位置

Public Sub Insert3Users
    Dim UserDAO As New UserDAO
    If UserDAO.Insere("USER_1") And UserDAO.Insere("USER_2") And UserDAO.Insere("USER_3") Then
        UserDAO.Close()
    Else
        UserDAO.Rollback()
    End If
End Sub

调用此 Insert3Users 方法后,我可以强制回滚,改为调用 DAO 类Close() Rollback() 方法,即使它成功了。

参加测试我在回滚中没有成功。谁能告诉我为什么?

编辑 - 例外

输出:

用户 DAO - 回
滚 回滚成功

谁能告诉我为什么?

是的,代码引发的异常会告诉您原因。

什么,你没有例外吗?我看看。。。哦,你得到了它们,但你把它们扔掉了:

Public Sub Rollback()
    Try
        transaction.Rollback()
        connection.Close()
    Catch
    EndTry
End Sub

别这样。如果有人试图帮助你(.NET 运行时帮助你查找错误的方式除外),请倾听他们的意见。不要闭上耳朵说"拉,我听不到你的声音!这就是一个空的Catch博客所做的。

从代码中删除这些虚假的异常处理程序(无处不在,而不仅仅是在此方法中),您将收到有用的错误消息。

最新更新