并發(fā)問題
如果沒有鎖定且多個用戶同時訪問一個數(shù)據(jù)庫,則當他們的事務(wù)同時使用相同的數(shù)據(jù)時可能會發(fā)生問題。并發(fā)問題包括: 丟失或覆蓋更新,未確認的相關(guān)性(臟讀),不一致的分析(非重復(fù)讀),幻像讀。但是如何來避免數(shù)據(jù)讀取時臟讀等問題出現(xiàn)呢?這里簡單介紹一下:
在SQL Server數(shù)據(jù)庫中,提供四種隔離級別:未提交讀、提交讀、可重復(fù)讀、可串行讀。這四種隔離級別可以不同程度地保證并發(fā)的數(shù)據(jù)完整性:
隔離級別 臟 讀 不可重復(fù)讀取 幻 像 未提交讀 是 是 是 提交讀 否 是 是 可重復(fù)讀 否 否 是 可串行讀 否 否 否
其中第二項為默認,而在.net框架中,同樣支持事務(wù)的隔離級別。我們可以通過System.Data.IsolationLevel 來實現(xiàn): public virtual IsolationLevel IsolationLevel {get;}
其成員及相應(yīng)的含義如下:
成員名稱 說明 值 Chaos
受 .NET Framework 精簡版的支持。 無法改寫隔離級別更高的事務(wù)中的掛起的更改。 16 ReadCommitted
受 .NET Framework 精簡版的支持。 在正在讀取數(shù)據(jù)時保持共享鎖,以避免臟讀,但是在事務(wù)結(jié)束之前可以更改數(shù)據(jù),從而導(dǎo)致不可重復(fù)的讀取或幻像數(shù)據(jù)。 4096 ReadUncommitted
受 .NET Framework 精簡版的支持。 可以進行臟讀,意思是說,不發(fā)布共享鎖,也不接受獨占鎖。 256 RepeatableRead
受 .NET Framework 精簡版的支持。 在查詢中使用的所有數(shù)據(jù)上放置鎖,以防止其他用戶更新這些數(shù)據(jù)。防止不可重復(fù)的讀取,但是仍可以有幻像行。 65536 Serializable
受 .NET Framework 精簡版的支持。 在 DataSet 上放置范圍鎖,以防止在事務(wù)完成之前由其他用戶更新行或向數(shù)據(jù)集中插入行。 1048576 Unspecified
受 .NET Framework 精簡版的支持。 正在使用與指定隔離級別不同的隔離級別,但是無法確定該級別。 -1
顯而意見,數(shù)據(jù)庫的四個隔離級別在這里都有映射。在這里,SqlTransaction以及OleDbTransaction等事務(wù)的 IsolationLevel 默認值為 ReadCommitted。那么我們?nèi)绾问褂媚兀?可以使用下面方法實現(xiàn):
trans = cnNorthwind.BeginTransaction( _ IsolationLevel.Serializ
|