6 事務隔離級別之Repeatable Read

2021-08-17 06:29:49 字數 2490 閱讀 9001

接下來我們學習mysql預設的事務隔離級別repeatable read,顧名思義,可重複讀,也即在乙個事務範圍內相同的查詢會返回相同的資料。

延續上面的栗子:

1. 小明很開心自己考了69分,於是他連線到資料庫查詢自己的成績來炫耀給小夥伴,由於repeatable read是預設的事務隔離級別,因此這次他不需要進行修改:

xiaoming> select @@tx_isolation;

+-----------------+

| @@tx_isolation |

+-----------------+

| repeatable-read |

+-----------------+

1 row in set (0.00 sec)

xiaoming> begin;

query ok, 0 rows affected (0.00 sec)

xiaoming> select * from scores where name = 'xiaoming';

+----+----------+-------+

| id | name | score |

+----+----------+-------+

| 1 | xiaoming | 69 |

+----+----------+-------+

1 row in set (0.00 sec)

2. 不幸的是,小明的班主任王老師複查試卷後,發現小明的成績多加了10分,於是他連線到資料庫來修改小明的成績:

mr.wang> begin;

query ok, 0 rows affected (0.00 sec)

mr.wang> update scores set score = 59 where name = 'xiaoming';

query ok, 1 row affected (0.00 sec)

rows matched: 1 changed: 1 warnings: 0

mr.wang> commit;

query ok, 0 rows affected (0.00 sec)

3. 接著小明覺得還不盡興,於是又查一次,還是69分,可憐的是他不知道自己其實是不及格的:

xiaoming> select * from scores where name = 'xiaoming';

+----+----------+-------+

| id | name | score |

+----+----------+-------+

| 1 | xiaoming | 69 |

+----+----------+-------+

1 row in set (0.00 sec)

可見repeatable read的確可以解決「不可重複讀」的問題,小明在一次事務中2次查詢的成績都是一樣的,即使2次查詢中王老師修改了成績。注意我們演示的場景中,王老師是針對一條已有的記錄進行了update, 如果王老師是新增即insert小明的成績,那麼小明的2次查詢的結果還是不一樣的,如下所示:

1.首先小明第一次查詢, 沒有成績

xiaoming> select * from scores where name = 'xiaoming';

empty set (0.00 sec)

2. 然後王老師錄入成績

mr.wang> begin;

query ok, 0 rows affected (0.00 sec)

mr.wang> insert into scores(name,score) values ("xiaoming", 59);

query ok, 1 row affected (0.00 sec)

mr.wang> commit;

query ok, 0 rows affected (0.00 sec)

3. 最後小明再次查詢成績,這次有了:

xiaoming> select * from scores where name = 'xiaoming';

+----+----------+-------+

| id | name | score |

+----+----------+-------+

| 1 | xiaoming | 59 |

+----+----------+-------+

1 row in set (0.00 sec)

通過上述例子,我們可以看出repeatable read也是存在以下問題的:

a. 幻讀,也即在一次事務範圍內多次進行查詢,如果其他併發事務中途插入了新的記錄,那麼之後的查詢會讀取到這些「幻影」行。

另外,我們也需要注意,不可重複讀對應的是修改即update,幻讀對應的是插入即insert。

事務隔離級別

1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...

事務隔離級別

四種隔離級別 隔離級別 髒 讀不可重複讀取 幻 像讀操作未提交 read uncommitted 是是 是讀操作已提交 read committed 否是 是可重複讀 repeatable read 否否 是快照否否 否可序列讀 serializable 否否 否 sql server 還支援使用行...

事務隔離級別

需要防止的現象和事務隔離級別 ansi iso sql 標準 sql92 定義了四種事務隔離級別 transaction isolation level 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...