首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL Transaction.Rollback失败

MYSQL Transaction.Rollback失败
EN

Stack Overflow用户
提问于 2017-01-25 12:33:46
回答 1查看 117关注 0票数 1

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

代码语言:javascript
复制
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类,继承自那个类。其他类有其他方法,例如:

代码语言:javascript
复制
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个用户,如果出现错误,我会撤消所有操作:

假设代码的任何其他位置都有一个方法

代码语言:javascript
复制
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 -回滚 回滚成功

EN

回答 1

Stack Overflow用户

发布于 2017-01-25 13:10:08

有人能告诉我为什么吗?

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

怎么,你没有破例吗?让我看看..。哦,你得到了,但你把它们扔掉了:

代码语言:javascript
复制
Public Sub Rollback()
    Try
        transaction.Rollback()
        connection.Close()
    Catch
    EndTry
End Sub

别干那事。如果人们试图帮助您(异常是.NET运行时帮助您查找bug的方式),请倾听他们的意见。不要闭上耳朵,说:“拉拉,我听不见!”这就是一个空的Catch博客所做的。

从代码中删除那些假异常处理程序(在任何地方,而不仅仅是在这个方法中),您就会得到有用的错误消息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41851790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档