![](/img/trans.png)
[英]Commiting inner transaction scope, while rolling back the outer transaction scope
[英]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.