我最近一直在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
博客所做的。
从代码中删除这些虚假的异常处理程序(无处不在,而不仅仅是在此方法中),您将收到有用的错误消息。