基本概念
事務的基本特性
原子性(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 未提交事務 此時另乙個事務又新增了一條資料...