mysql可重複讀注意事項

2021-08-21 22:12:02 字數 755 閱讀 7106

看一下維基關於不可重複讀的定義:

在一次事務中,當一行資料獲取兩遍得到不同的結果表示發生了「不可重複讀」. 在基於鎖的併發控制中「不可重複讀」現象發生在當執行select 操作時沒有獲得讀鎖或者select操作執行完後馬上釋放了讀鎖; 多版本併發控制中當沒有要求乙個提交衝突的事務回滾也會發生「不可重複讀」現象。[1]

舉個例子:

有一條記錄id:1, name:l

事務a:

set autocommit=0;

begin;

select * from test1 where id=1;

select * from test1 where id=1;

update test1 set name='a'

where id=1;

commit;

事務b:

update test1 set name='b'

where id=1;

先執行a的select,再執行b,再執行a的第二次select,update,然後提交事務。根據維基的定義:

在repeatable read 級別下事務b會被阻塞,直到事務a執行成功

但是mysql不是這樣的,b事務不會被阻塞。mysql只保證第二次select同一條記錄仍然是相同的值,但是事務b的更新不會被阻塞,不知道是不是mysql的實現不標準

多說一句,在serializable級別下b會被阻塞。

tips:

mysql 可重複讀。

一 可重複讀 我們先看看現象,再分析原理。我的mysql版本是5.5。下面是一張表,只有一條資料,並且我開啟了事物 此時,另乙個事物將record加1,因此我在開啟乙個命令列客戶端,執行下面的命令 成功加1之後,實際上,資料庫中record肯定是2。然後回到之前的客戶端,再查一次 沒毛病,recor...

mysql可重複讀

mysql innodb的預設隔離級別是可重複讀,之前理解有些偏差,查閱一些資料後總結出幾點 首先有兩個概念 一致性檢視 當乙個事務開啟時,innodb會生成乙個檢視,這個檢視是邏輯檢視,通過undo log和row tranzaction id控制實現。在該事務的任何時間點,一致性檢視中的資料都是...

MySQL 的可重複讀

我在這裡分享一篇關於 mysql 的可重複讀介紹,講得挺好的,可以解決一些疑惑,鏈結在下方引用處。sql 1992 年標準關於幻讀 phantom 的解釋 乙個事務 t1 根據某些查詢條件 讀取某幾行資料,然後事務 t2 執行 sql 語句插入一行或多行滿足查詢條件 的資料 這時候如果事務 t1 重...