一致性非鎖定讀與一致性鎖定讀

2021-10-11 14:32:50 字數 1089 閱讀 1430

一致性非鎖定讀(consistent nonlocking read)是指innodb儲存引擎通過 行多版本控制(multi versioning)的方式來讀取當前執行時間資料庫中行的資料。如果讀取的行正在執行delete或update操作,這時讀取操作不會因此去等待行上鎖的釋放,相反地,innodb儲存引擎會去讀取行的乙個快照資料。

如圖,直觀地展現了innodb儲存引擎一致性的非鎖定讀。之所以稱其為非鎖定讀,因為不需要等待訪問的行上x鎖的釋放。快照資料是指該行的之前版本的資料,該是先是通過undo段來完成。而undo用來在事務中回滾資料,因此快照資料本身是沒有額外的開銷。此外,讀取快照資料是不需要上鎖的,因為沒有事務需要對歷史的資料進行修改操作。

非鎖定讀機制極大地提高了資料庫的併發性,這是innodb儲存引擎的預設讀取方式。但是在不同事務隔離級別下,讀取的方式不一定相同。此外,即使都是使用非鎖定的一致性讀,但是對於快照資料的定義也各不相同。在事務隔離級別read committed 和repeatable read下,innodb都使用非鎖定一致性讀。然而,對於快照資料的定義卻不同。在read committed事務隔離級別下,對於快照資料,非一致性讀總數讀取被鎖定行的最新的快照資料。而在repeatable read事務隔離級別下,對於快照資料,非鎖定一致性讀總是獲取事務開始時的行資料版本。

快照資料其實就是當前行資料之前的歷史版本,每行記錄可能有多個版本,因此一行記錄可能有不止乙個快照資料,一般稱這種技術為 行多版本技術。由此帶來的併發控制,稱之為多版本併發控制(multi version concurrency control, mvcc)。

一致性鎖定讀

在某些情況下,使用者需要顯示地對資料庫讀取操作進行加鎖,以保證資料邏輯的一致性。而這要求資料庫支援加鎖語句,即使是對於select的唯讀操作。innodb儲存引擎對於select語句支援兩種一致性的鎖定讀(locking read)操作:

select…for update對讀取的行記錄加乙個x鎖;select…lock in share mode對讀取的行記錄加乙個s鎖。

一致性非鎖定讀和一致性鎖定讀

在預設配置下innodb的隔離級別是repeatable read,innodb的select操作使用的是一致性非鎖定讀 一致性的非鎖定行讀 consistent nonlocking read,簡稱cnr 是指innodb儲存引擎通過行多版本控制 multi versioning 的方式來讀取當前...

mysql InnoDB一致性非鎖定讀(MVCC)

一致性非鎖定讀 consistent nonlocking read 指innodb儲存引擎通過多版本控制的方法來讀取當前執行時間資料庫中行的資料。如果讀取的資料行正在執行delete或update操作,這時讀取不會因此去等待行上鎖 的釋放。相反innodb儲存引擎會去讀取乙個快照資料。之所以成為非...

資料讀一致性

undo段由兩個元件組成 undo頭和undo入口。undo段的第一塊是undo頭。undo被建立時僅有undo頭被建立。保留時間表 retention table 這是自動管理undo新增的乙個元件。儲存了undo段中每乙個區最後乙個事務提交的時間。事務表 transaction table 儲存...