設定隔離級別實現併發控制

2021-07-02 16:14:42 字數 2388 閱讀 3877

2010-02-08 20:03  劉奎  清華大學出版社  

13.4.4  設定隔離級別實現併發控制

使用隔離級別與通過使用鎖定選項控制鎖定方式具有相同的效果。通常情況下,使用set transation語句來設定事務的隔離級別,該語句的語法格式如下:

語句中的level表示可選的可隔離級別,從低到高分為read uncommitted、repeatable read和serializable。

下面講解read uncommitted和repeatable read隔離級別。

1.read uncommitted

read uncommitted是限制最小的隔離級別。該選項的作用與在事務內所有語句中的所有表上設定nolock相同。當設定該選項時,在事務結束前可以更改資料值。

下面通過例項講解read uncommitted隔離級別的使用方法。

【例項13-8】本例項實現的是使用者u1與u2先後訪問"商品資訊"資料表,並將事務的隔離級別設定為read uncommitted。使用者u1實現的**如**13.9所示;使用者u2實現的**如**13.10所示。

**13.9

**13.10

【執行**】首先執行**13.9,然後執行**13.10。在u1結束回滾操作之前,u2訪問了使用者u1正在處理的"商品庫存"資料表,因為設定了隔離級別read uncommitted,因此出現了讀"髒資料"的資料異常。

u1執行以後,輸出了u1結束事務之前的資料和結束事務之後的資料,結果如圖13.6所示。u2執行以後,讀取了使用者u1中修改的資料(髒資料),結果如圖13.7所示。

圖13.6  **13.9的執行結果

圖13.7  **13.10的執行結果

【深入學習】關於上述**的分析如下所示:

第1~2行啟動乙個事務,在"商品庫存"資料表中將事務的隔離級別設定為read uncommitted。

第3~6行修改資料表中的資料資訊,然後將修改後的資料資訊顯示出來。

第7~10行在等待15秒之後執行事務回滾的操作,然後將資料表中的資料資訊再次顯示出來。

第11~13行實現在另乙個查詢視窗中啟動乙個事務,在"商品庫存"資料表中將事務的隔離級別設定為read uncommitted,然後再將資料表中的資料資訊顯示出來。

說明:若想實現本例項,應首先建立兩個不同的查詢視窗,然後將**13.9和**13.10輸入到不同的查詢視窗中分別執行,並且兩個查詢視窗中程式**的執行間隔不能超過15秒。

2.repeatable read

使用repeatable read可以鎖定查詢中所有的資料,以防止其他使用者更改資料。下面通過例項講解repeatable read隔離級別的使用方法。

【例項13-9】本例項實現使用者u1與u2先後訪問"商品庫存"資料表,並將事務的隔離級別設定為repeatable read。使用者u1實現的**如**13.11所示;使用者u2實現的**如**13.12所示。

**13.11

**13.12

【執行**】首先執行**13.11,然後執行**13.12。在使用者u1執行第乙個select操作和第二個select操作之前,使用者u2向資料表中插入了資料,所以造成了使用者u1兩次查詢結果不一致現象的發生。**13.11執行後的結果如圖13.8所示,**13.12執行後的結果如圖13.9所示。

圖13.8  **13.11的執行結果

圖13.9  **13.12的執行結果

【深入學習】關於上述**的分析如下所示:

第1~2行啟動乙個事務,在"商品庫存"資料表中將事務的隔離級別設定為repeatable read。

第3~4行查詢"商品庫存"資料表中的資料資訊。

第5~7行實現在等待10秒之後再次查詢"商品庫存"資料表中的資料資訊的操作。

第8行實現執行事務回滾的操作。

第9~13行實現在另乙個查詢視窗中啟動乙個事務,在"商品庫存"資料表中將事務的隔離級別設定為repeatable read,然後向資料表中插入一條資料資訊,最後將資料表中的資料資訊顯示出來。

說明:與前面講解的相關例項一樣,在實現本例項時,應首先建立兩個不同的查詢視窗,然後將**13.11和**13.12輸入到不同的查詢視窗中分別執行,並且兩個查詢視窗中程式**的執行間隔不能超過10秒。

MySQL之隔離級別和多版本併發控制

隔離級別 未提交讀 read uncommitted 事務中的修改,即使沒有提及,對其他事務也是可見的。提交讀 read committed 乙個事務只能讀取已經提及的事務所做的修改。可重複讀 repeatable read 保證在同乙個事務中多次讀取同樣資料的結果是一樣的。可序列化 seriaki...

事務併發 事務隔離級別

併發問題可歸納為以下幾類 a.丟失更新 撤銷乙個事務時,把其他事務已提交的更新資料覆蓋 a和b事務併發執行,a事務執行更新後,提交 b事務在a事務更新後,b事務結束前也做了對該行資料的更新操作,然後回滾,則兩次更新操作都丟失了 b.髒讀 乙個事務讀到另乙個事務未提交的更新資料 a和b事務併發執行,b...

事務併發 事務隔離級別

併發問題可歸納為以下幾類 a.丟失更新 撤銷乙個事務時,把其他事務已提交的更新資料覆蓋 a和 b事務併發執行,a事務執行更新後,提交 b事務在 a事務更新後,b事務結束前也做了對該行資料的更新操作,然後回滾,則兩次更新操作都丟失了 b.髒讀 乙個事務讀到另乙個事務未提交的更新資料 a和 b事務併發執...