mysql兄弟 MySQL 事務隔離級別

2021-10-17 23:21:58 字數 3481 閱讀 8948

基本概念

事務的基本特性

原子性(atomicity):當開啟事務後,後面的所有操作,要麼全部成功,要麼全部失敗。

一致性(consistency):事務執行前後資料庫狀態保持一致。

隔離性(isolation):在事務未提交前,它的操作對其他使用者是不可見的。

永續性(durability):一旦事務成功,將進行永久的變更,記錄與redo日誌;

事務併發引發的問題

髒讀:所讀取的資料已經被修改了,屬於沒有意義的資料。

不可重複讀:事務a多次讀取同一條資料,事務b在a讀取的過程中對這條資料進行了更改,導致事務a讀取的資料**現的結果不一致。

幻讀:同樣乙個查詢錯做在整個事務過程中多次執行後,查詢所得的結果集不一樣。(側重於新增和刪除操作)

事務的隔離級別

讀未提交(read-uncommitted):讀取其它事務未完成的結果。

不可重複讀(read-committed) :事務完成後,才能讀取該事務的資料更新後的結果。

可重複讀(repeatable-read) :在整個事務的過程中,對同一筆資料的讀取結果是相同的,不管其他事務是否同時在對同一筆資料進行更新,也不管其他事務對同一筆資料的更新提交與否。

序列化(serializable) :事務操作都必須依次順序執行,可以避免其他隔離級別遇到的所有問題,是最為安全的隔離級別, 但同時也是效能最差的隔離級別。

不同隔離級別引發的問題

隔離級別

髒讀不可重複讀

幻讀讀未提交

yesyes

yes不可重複讀

noyes

yes可重複讀

nono

yes序列化

nono

no案例說明

本此案例使用單錶進行測試,具體表結構如下所示:

1 drop table if exists `user`;2 create table `user` (3 `id` int(11) not nullauto_increment,4 `name` varchar(255) character set utf8 collate utf8_general_ci null default null,5 `age` int(11) null default null,6 `balance` int(255) null default null,7 primary key(`id`) using btree8 )9

10 insert into `user` values (1, '張三', 21, 100);11 insert into `user` values (2, '李四', 21, 0);

表中有兩條資料張三的餘額為100,李四的餘額為0;

讀未提交

在windows環境下使用dos視窗(此處需要兩個視窗進行測試分別為a/b)進入mysql的客戶端,並切換到此表對應的資料庫下。

在a視窗和b視窗下對其事務的模式進行設定並開啟事務。

1 set session transaction isolation level read uncommitted;2

3 start transaction;

在視窗a中對張三的餘額進行調整(加50),在不進行提交的前提下在視窗b對張三的餘額進行查詢,結果如下:

視窗a

視窗b

我們發現客戶端b的資料也是被更新了,但是,如果有一天由於某些問題,客戶端的這次更新進行了回滾操作,那麼客戶端b中查詢的資料就屬於髒資料了,這時候就會有髒讀的問題。

不可重複讀

同樣的開啟兩個視窗並對其事務進行設定。

1 set session transaction isolation level read committed;2

3 start transaction;

對在視窗a中對張三的餘額進行調整(加50),在不進行提交的前提下在視窗b對張三的餘額進行查詢,結果如下:

視窗a

視窗b

這裡我們發現在a視窗沒有提交事務前b視窗無法拿到a視窗更新的資料,因此解決了髒讀的情況。

下來我們對a視窗的資料進行提交。並再次查詢結果。

視窗a

視窗b

這個時候b視窗的資料在a視窗提交事務前後的資料是不一致的,因此會有不可重複讀的問題產生。

可重複讀

同樣的開啟兩個視窗並對其事務進行設定。

1 set session transaction isolation level repeatable read;2

3 start transaction;

對在視窗a中對張三的餘額進行調整(加50),在不進行提交的前提下在視窗b對張三的餘額進行查詢,結果如下:

視窗a

視窗b

這裡我們發現在a視窗沒有提交事務前b視窗無法拿到a視窗更新的資料,因此解決了髒讀的情況。

下來我們對a視窗的資料進行提交。並再次查詢結果。

視窗a

視窗b此時發現已經解決了不可重複讀的問題。

這時候如果在視窗b對張三的資料再進行增加(+50)呢?那麼最終的資料會是多少呢?

視窗a視窗b

可見b視窗的資料是在a視窗的基礎上進行操作的,因此資料的一致性沒有被破壞,因為可重複讀的隔離級別下使用了mvcc機制。

下來我們在b視窗新增一條資料,並進行提交。

1 insert into `user` values (3, '王五', 21, 200);

視窗a客戶端a兩次結果發生了不一致,出現幻讀。

序列化同樣的開啟兩個視窗並對其事務進行設定。

1 set session transaction isolation level serializable;2

3 start transaction;

視窗a對user表中的資料進行查詢,在視窗b對資料進行更新。

視窗a視窗b

mysql隔離級別 簡書 MySQL事務的隔離級別

一 事務的基本要素 acid 1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程 錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 con...

Mysql 事務隔離級別 InnoDB實現隔離機制

在read uncommitted級別中,事務所做的寫操作,即使沒有提交,對其他事務也是可見的,a事務可以讀取b事務未提交的資料,這就叫做未提交讀 髒讀。這個級別會導致很多問題,但從效能上來說,並不比其他級別好太多。大部分資料庫系統的預設隔離級別就是 read committed,它解決了髒讀的問題...

資料庫事務的隔離級別和MySql事務的隔離級別

髒讀是指,乙個事務的處理過程中讀取到了另乙個未提交的事務中的資料。不可重複讀指,在乙個範圍內,多次查詢去返回了不同的資料值,這是由於在查詢間隔,被另乙個事務修改並提交了。虛讀 幻讀 指,乙個事務對一批資料的name欄位做出全部修改後 將該字段的值從a改為b 未提交事務 此時另乙個事務又新增了一條資料...