我最近在Visual中实现了一个请求序列,并且希望在一些失败时回滚。因此,我所做的如下:
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方法之后,我可以强制回滚,而是调用Close() -- DAO类的Rollback()方法,即使它成功了。
参加测试,我在回滚方面没有成功。有人能告诉我为什么吗?
编辑-例外
输出:
UserDAO -回滚 回滚成功
发布于 2017-01-25 13:10:08
有人能告诉我为什么吗?
是的,代码引发的异常会告诉您原因。
怎么,你没有破例吗?让我看看..。哦,你得到了,但你把它们扔掉了:
Public Sub Rollback()
Try
transaction.Rollback()
connection.Close()
Catch
EndTry
End Sub别干那事。如果人们试图帮助您(异常是.NET运行时帮助您查找bug的方式),请倾听他们的意见。不要闭上耳朵,说:“拉拉,我听不见!”这就是一个空的Catch博客所做的。
从代码中删除那些假异常处理程序(在任何地方,而不仅仅是在这个方法中),您就会得到有用的错误消息。
https://stackoverflow.com/questions/41851790
复制相似问题