如何在.NET中實現(xiàn)事務(wù)機制呢? 通常可以使用2種方式: 直接寫入到sql 中;使用ADO.NET 實現(xiàn)。下面依次作一下介紹:
方法1:直接寫入到sql 中
使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 實現(xiàn):
例如
BEGIN TRANS
DECLARE @orderDetailsError int, @productError int
DELETE FROM "Order Details" WHERE ProductID=42
SELECT @orderDetailsError = @@ERROR
DELETE FROM Products WHERE ProductID=42
SELECT @productError = @@ERROR
IF @orderDetailsError = 0 AND @productError = 0
COMMIT TRANS
ELSE
ROLLBACK TRANS
這種方法比較簡單,具體可以查閱相關(guān)sql server 幫助
方法2 :使用ADO.NET 實現(xiàn),使用這種方式的優(yōu)點是可以在中間層來管理事務(wù),當然你也可以選擇在數(shù)據(jù)層來實現(xiàn)。
SqlConnection 和OleDbConnection 對象有一個 BeginTransaction 方法,它可以返回 SqlTransaction 或者OleDbTransaction 對象。而且這個對象有 Commit 和 Rollback 方法來管理事務(wù),具體例子如下:
cnNorthwind.Open()
Dim trans As SqlTransaction = cnNorthwind.BeginTransaction()
Dim cmDel As New SqlCommand()
cmDel.Connection = cnNorthwind
cmDel.Transaction = trans
Try
cmDel.CommandText = _
"DELETE [Order Details] WHERE ProductID = 42"
cmDel.ExecuteNonQuery()
cmDel.CommandText = "DELETE Products WHERE ProductID = 42"
cmDel.ExecuteNonQuery()
trans.Commit()
Catch Xcp As Exception
trans.Rollback()
Finally
cnNorthwind.Close()
End Try
Ok,通過上面的例子可以實現(xiàn)與方法1同樣的效果。
并發(fā)問題:
如果沒有鎖定且多個用戶同時訪問一個數(shù)據(jù)庫,則當他們的事務(wù)同時使用相同的數(shù)據(jù)時可能會發(fā)生問題。并發(fā)問題包括: 丟失或覆蓋更新,未確認的相關(guān)性(臟讀),不一致的分析(非重復讀),幻像讀。但是如何來避免數(shù)據(jù)讀取時臟讀等問題出現(xiàn)呢?
您可以參考后面我寫的文章:如何在.NET中實現(xiàn)
|