接下來我們學習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 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...