7 事務隔離級別之Serializable

2021-08-17 06:34:08 字數 1619 閱讀 6816

最後我們學習一下最高的事務隔離級別serializable,顧名思義,可序列化的,也即併發事務序列執行。很顯然,該級別可以避免前面講到的所有問題:「髒讀」、「不可重複讀」和「幻讀」。代價是處理事務的吞吐量低,嚴重浪費資料庫的效能,因此要慎用此事務隔離級別。

下面演示serializable如何解決這些問題:

1. 小明連線資料庫去查詢自己本學期的成績,他設定session(當前連線)的事務隔離級別為serializable:

xiaoming> set session transaction isolation level serializable;

query ok, 0 rows affected (0.00 sec)

xiaoming> select @@tx_isolation;

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

| @@tx_isolation |

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

| serializable |

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

1 row in set (0.00 sec)

2. 小明開始查詢成績,由於還沒有錄入,因此沒有成績:

xiaoming> begin;

query ok, 0 rows affected (0.00 sec)

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

empty set (0.00 sec)

3. 這時小明的班主任王老師也連線資料庫來錄入成績,可是他會卡在插入第一條成績資訊這裡, 如下所示,insert語句遲遲不會返回:

mr.wang> begin;

query ok, 0 rows affected (0.00 sec)

mr.wang> insert into scores(name, score) values ('xiaoming', 69);

4. 小明結束本次查詢:

xiaoming> commit;

query ok, 0 rows affected (0.00 sec)

5. 這時王老師插入第一條成績才完成:

mr.wang> insert into scores(name, score) values ('xiaoming', 69);

query ok, 1 row affected (3.42 sec)

6. 如果小明久久不結束查詢,還會導致王老師錄入成績超時:

xiaoming> insert into scores(name, score) values ('xiaoming', 69);

error 1205 (hy000): lock wait timeout exceeded; try restarting transaction

從上面的例子我們可以看出,如果乙個session設定隔離級別為serializable時,其執行事務時會阻塞其他併發事務,從上面的錯誤資訊中我們也可以看出應該是通過某種鎖來實現的。既然是這樣,那麼「髒讀」、「不可重複讀」和「幻讀」自然是不可能發生了。

事務隔離級別

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