InnoDB實現序列化隔離級別的方法

2022-09-25 20:42:13 字數 871 閱讀 2210

序列化的實現

innodb對於序列化的實現方式,是通過兩種方式實現的。

第一種,當select語句在乙個顯式的事務塊內,如執行表11-9中的編號為1的情況,將施加lock_s鎖,根據表11-6(記錄鎖事務鎖相容表)可知,lock_s鎖排斥寫鎖,所以序列化隔離級別下只允許併發地讀取操作,併發寫被禁止,因此實現了可序列化。

相應**如下:

ha_innobase::external_lock(...)

//否則,不加鎖(這一點也很重要)

... } else

...}

第二種,當select語句不在乙個顯式的事務塊內,則通過獲取最新快照(在事務開始的時候,),然後讀取資料。此時,因基於快照的一致性讀不需要加鎖,所以其加鎖情況對應到了表11-9中的編號2對應的情況。 

表11-9 序列化隔離級別加鎖情況

說明:    s0:select * from bluesea where c1=2;//使用主鍵索引做where條件

另外,對於flush...with read lock語句,序列化隔離級別下也需要加讀鎖lock_s

**如下:

ha_innobase::store_lock(

... /* check for flush tables ... with read lock */

if (trx-&giwcqrt;isolation_level == trx_iso_serializable) else

...} iwcqr

與序列化相關的,還有innobase_query_caching_of_table_permitted()函式,序列化隔離級別不允許緩衝查詢。

總結本文標題: innodb實現序列化隔離級別的方法

本文位址:

序列化隔離級別Key Range鎖定的真實鍵範圍

大家都知道在序列化隔離級別中引入了鍵範圍鎖定。鍵範圍鎖可防止其他事務插入其鍵值位於可序列化事務讀取的鍵值範圍內的新行,從而確保滿足此要求。但是對於鎖定的範圍真的清楚嗎?前幾天看到有人對於鎖範圍的疑問,發現鎖定的資料比想象的要多。下面我們看個例子 create tableand insert test...

innodb事務隔離級別

事務隔離級別 sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用...

InnoDB事務隔離級別

會話1 會話2begin begin update table set age 10 where id 1 select age from table where id 1 commit commit rollback 會話2將age的值改變,且並未提交,此時會話1select查詢結果為10.如果會...