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