C 資料庫事務原理

2021-05-24 14:09:44 字數 2034 閱讀 4232

隔離級別的概念

企業級的資料庫每一秒鐘都可能應付成千上萬的併發訪問,因而帶來了併發控制的問題。由資料庫理論可知,由於併發訪問,在不可預料的時刻可能引發如下幾個可以預料的問題:

髒讀:包含未提交資料的讀取。例如,事務1 更改了某行。事務2 在事務1 提交更改之前讀取已更改的行。如果事務1 回滾更改,則事務2 便讀取了邏輯上從未存在過的行。

不可重複讀取:當某個事務不止一次讀取同一行,並且乙個單獨的事務在兩次(或多次)讀取之間修改該行時,因為在同乙個事務內的多次讀取之間修改了該行,所以每次讀取都生成不同值,從而引發不一致問題。

幻象:通過乙個任務,在以前由另乙個尚未提交其事務的任務讀取的行的範圍中插入新行或刪除現有行。帶有未提交事務的任務由於該範圍中行數的更改而無法重複其原始讀取。

如你所想,這些情況發生的根本原因都是因為在併發訪問的時候,沒有乙個機制避免交叉訪問所造成的。而隔離級別的設定,正是為了避免這些情況的發生。事務準備接受不一致資料的級別稱為隔離級別。隔離級別是乙個事務必須與其它事務進行隔離的程度。較低的隔離級別可以增加併發,但代價是降低資料的正確性。相反,較高的隔離級別可以確保資料的正確性,但可能對併發產生負面影響。

根據隔離級別的不同,dbms為並行訪問提供不同的互斥保證。在sql server資料庫中,提供四種隔離級別:未提交讀、提交讀、可重複讀、可序列讀。這四種隔離級別可以不同程度地保證併發的資料完整性:

隔離級別

髒 讀不可重複讀取

幻 像未提交讀是是

是提交讀否是

是可重複讀否否

是可序列讀否否

否 可以看出,「可序列讀」提供了最高端別的隔離,這時併發事務的執行結果將與序列執行的完全一致。如前所述,最高端別的隔離也就意味著最低程度的併發,因此,在此隔離級別下,資料庫的服務效率事實上是比較低的。儘管可序列性對於事務確保資料庫中的資料在所有時間內的正確性相當重要,然而許多事務並不總是要求完全的隔離。例如,多個作者工作於同一本書的不同章節。新章節可以在任意時候提交到專案中。但是,對於已經編輯過的章節,沒有編輯人員的批准,作者不能對此章節進行任何更改。這樣,儘管有未編輯的新章節,但編輯人員仍可以確保在任意時間該書籍專案的正確性。編輯人員可以檢視以前編輯的章節以及最近提交的章節。這樣,其它的幾種隔離級別也有其存在的意義。

在.net框架中,事務的隔離級別是由列舉system.data.isolationlevel所定義的:

[flags]

[serializable]

public enum isolationlevel

其成員及相應的含義如下:

成 員含 義

chaos

無法改寫隔離級別更高的事務中的掛起的更改。

readcommitted

在正在讀取資料時保持共享鎖,以避免髒讀,但是在事務結束之前可以更改資料,從而導致不可重複的讀取或幻像資料。

readuncommitted

可以進行髒讀,意思是說,不發布共享鎖,也不接受獨佔鎖。

repeatableread

在查詢中使用的所有資料上放置鎖,以防止其他使用者更新這些資料。防止不可重複的讀取,但是仍可以有幻像行。

serializable

在dataset上放置範圍鎖,以防止在事務完成之前由其他使用者更新行或向資料集中插入行。

unspecified

正在使用與指定隔離級別不同的隔離級別,但是無法確定該級別。

顯而意見,資料庫的四個隔離級別在這裡都有對映。

預設的情況下,sql server使用readcommitted(提交讀)隔離級別。

關於隔離級別的最後一點就是如果你在事務執行的過程中改變了隔離級別,那麼後面的命名都在最新的隔離級別下執行——隔離級別的改變是立即生效的。有了這一點,你可以在你的事務中更靈活地使用隔離級別從而達到更高的效率和併發安全性。

最後的忠告

無疑,引入事務處理是應對可能出現的資料錯誤的好方法,但是也應該看到事務處理需要付出的巨大代價——用於儲存點、回滾和併發控制所需要的cpu時間和儲存空間。

C 資料庫事務原理及實踐

什麼是資料庫事務 資料庫事務是指作為單個邏輯工作單元執行的一系列操作。設想網上購物的一次交易,其付款過程至少包括以下幾步資料庫操作 更新客戶所購商品的庫存資訊 儲存客戶付款資訊 可能包括與銀行系統的互動 生成訂單並且儲存到資料庫中 更新使用者相關資訊,例如購物數量等等 正常的情況下,這些操作將順利進...

C 資料庫事務原理及實踐 上

本文將涉及到在 net 框架下使用 c 語言操縱資料庫事務的各個方面。體驗sql語言的事務機制 作為大型的企業級資料庫,sql server2000 對事務提供了很好的支援。我們可以使用 sql語句來定義 提交以及回滾乙個事務。如下所示的 sql 定義了乙個事務,並且命名為 mytransactio...

mysql資料庫事務原理(一)

原子性 穩定性和永續性是通過redo 和 undo 日誌檔案實現的,不管是redo還是undo檔案都會有乙個快取我們稱之為redo buf和undo buf。同樣,資料庫檔案也會有快取稱之為data buf。undo記錄了資料在事務開始之前的值,當事務執行失敗或者rollback時可以通過undo記...