簡體   English   中英

交易不會回滾-范圍問題?

[英]transaction not rolling back - scope issue?

我很難理解為什么我無法使該交易回滾。 我有一個DataAccess對象,可以處理連接/事務。 我有一個MailingData業務對象和一個MailingDataAccess對象,該對象從MailingData對象中獲取DataAccess對象byRef並執行存儲過程。 我立即回滾了更新,但不回滾。 我猜這是一個范圍問題。 救命? 我當時正在用dataaccess做byval,但是那沒有用,所以我改成了byref。

vb.net控制台應用程序-代碼:

     Dim da As DataAccess = New DataAccess("mydb")

     Try
        ' business object
        Dim mailingData as New MailingData()

        ' start a transaction
        da.StartTransaction()

        ' do stuff, set properties...

        ' pass the data access object byref to a method that calls a stored proc
        mailingData.UpdateCategorize(da)


        ' testing, this doesn't roll back the update from the above stored proc            
        da.RollBackTransaction()

        'da.CommitTransaction()
    Catch ex As Exception
        da.RollBackTransaction()

    End Try

我的數據訪問對象:

    Private _database As Database
    Private _transaction As Data.IDbTransaction
    Private _connection As Data.IDbConnection


    Public ReadOnly Property Database() As Database
        Get
            Return _database
        End Get
    End Property

    Public ReadOnly Property Connection() As IDbConnection
        Get
            Return _connection
        End Get
    End Property

    Public ReadOnly Property Transaction() As Data.IDbTransaction
        Get
            Return _transaction
        End Get
    End Property

    Public Sub New()
        _database = GetDatabase()
    End Sub

    Public Sub New(ByVal database As String)
        _database = GetDatabase(database)
    End Sub


    Private Function GetDatabase() As Database

        Return DatabaseFactory.CreateDatabase()

    End Function


    Private Function GetDatabase(ByVal database As String) As Database
            Return DatabaseFactory.CreateDatabase(database)
    End Function

    '-- if not transaction started, start new one.
    Public Sub StartTransaction()
        If _transaction Is Nothing Then
            _connection = _database.CreateConnection()

            _connection.Open()
            _transaction = _connection.BeginTransaction
        End If
    End Sub

    Public Sub CommitTransaction()
        _transaction.Commit()
        If Not IsNothing(Connection) Then
            Connection.Close()
        End If

    End Sub

    Public Sub RollBackTransaction()

        _transaction.Rollback()

        If Not IsNothing(Connection) Then
            Connection.Close()
        End If
    End Sub


End Class

mailingData業務對象中的mailingData.UpdateCategorize()定義為:

Public Function UpdateCategorize(ByRef da As DataAccess) As Integer
    Dim mailingDA As New MailingDataAccess

    Return mailingDA.UpdateCategorize(da, Me)
End Function

MailingDataAccess.UpdateCategorize定義為:

Public Function UpdateCategorize(ByRef da As DataAccess, ByVal clsMailing As MailingData) As Integer
        Dim db As Database = da.Database

        Dim DbCommand As DbCommand
        Dim dbStatus As Integer = 0

        DbCommand = da.Database.GetStoredProcCommand("proc_UpdateCategorize")
        With db
            .AddInParameter(DbCommand, "@pMailingID", Data.DbType.Int32, clsMailing.MailingID)

        dbStatus = db.ExecuteNonQuery(DbCommand)

        Return dbStatus
    End Function

我知道了這一行:

 dbStatus = db.ExecuteNonQuery(DbCommand)

應該:

 dbStatus = db.ExecuteNonQuery(DbCommand, da.Transaction)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM