我們知道事務有四種特性
(1)原子性:乙個事務被視為不可分割的乙個單位
(2)隔離性:事務之間隔離開來,乙個事務所做的修改,未提交之前另乙個事務是不可見的
(3)永久性:事務的更改是永久的
(4)一致性:資料庫總是從乙個一致性的狀態轉換到另外乙個一致性的狀態中
在此之前,我們來學習一下mysql 如何設定隔離級別
select
@@global
.tx_isolation;
select
@@session
.tx_isolation;
select
@@tx_isolation;
set tx_isolation = 'read-uncommited';
設定預設隔離級別
1、預設:下乙個事務開始 2 3
、global:從此開始,全域性都是
隔離級別:
(1)read uncommited(讀未提交):發生髒讀
客戶端a
開始狀態:
客戶端b
2、客戶端a開始事務,但是沒有提交,客戶端b可以看到
1)、客戶端a的狀態:
客戶端b的狀態:
2)開始事務,並在客戶端改變值
3)這時候檢視客戶端b,可以看到變化,這就是髒讀現象
(2)read committed (讀提交):容易發生「不可重複讀」
1、首先先改變兩邊的狀態
客戶端a:
客戶端b:
2、客戶端a開始事務,客戶端b也開始事務
3、這時候a更新一條記錄,並且提交完畢,b未提交事務,又讀了一次,這時候,兩次讀的資料不一致,導致了不可重複讀
客戶端a
客戶端b:
簡單的來說
客戶端a
客戶端b
事務開始
事務開始
讀欄位name為lin
更新欄位name=qin
提交事務
讀欄位name為qin,兩次讀都不一致
提交事務
(3)repeatable read(可重複讀):幻讀現象
簡單的用**表示下:
客戶端a
客戶端b
事務開始
事務開始
讀name=lin
更新name=qin
commit提交事務
讀name還是為lin
事務2開始
插入一條資料
1、改變事務隔離級別
2、客戶端b改變並且提交
3、客戶端a兩次讀都未發生不可重複讀現象
4、客戶端b插入一條記錄(還未提交)
5、檢視客戶端a未發生變化,這時候客戶端b提交
6、再次檢視客戶端a的資料,還是沒有發生任何問題
所以mysql到了repeatable read級別之後,沒有出現任何問題
這是因為innodb儲存引擎通過mvcc(多版本控制)解決了幻讀的問題。
MySQL 四種事務隔離級別
mysql 事務都是指在 innodb 引擎下,myisam 引擎不支援事務。顯而易見,能夠讀取到,其他事務未提交的資料。既然其他事務未提交,就代表資料可能會回滾,這也意味著,可能讀取到的資料根本就不存在。特點 能讀取其它事務未提交的資料。存在事務問題 髒讀,不可重複讀,幻讀 這個隔離級別,只能讀取...
MySQL的四種事務隔離級別
一 事務的基本要素 acid 1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 co...
mysql的四種事務隔離級別
一 事務的基本要素 acid 1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 co...