1. 程式人生 > 實用技巧 >Mysql事務隔離級別

Mysql事務隔離級別

什麼是事務?

老生常談:事務是邏輯上的一組操作,要麼都執行,要麼都不執行

經典例項:轉賬給你,我減少100,你增加100,不能因為系統故障導致,我錢轉出了,而你沒收到

事務的四大特性

  • A:原子性,最小執行單位,要麼都執行,要麼都不執行
  • C:一致性,?
  • I:隔離性,併發訪問資料庫是,兩個事務是獨立的,
  • D:永續性

序列執行是不會事務執行很順暢,但當不同事務同時執行時可能出現各種情況,以student表為例

# 表定義

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`
id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

# 初始資料

mysql> select * from student;
+----+----------+---------------------+
| id | name     | create_time         |
+----+----------+---------------------+
|  1 | Jarry    | 2020-08-13 09:14:01 |
|  2 | Hameimei | 2020-08-13 09:14:09 |
+----+----------+---------------------+
2
rows in set (0.00 sec)

事務併發可能發生的情況

a. 髒讀

一個事務讀到另一個事務未提交的事務

session_2在session_1讀期間改了資料後,又回退了事務,導致session_1讀的資料根本不存在

髒讀只在讀未提交隔離級別才出現

b. 不可重複讀

一個事務中,可以讀到另一個事務已經提交的資料

不可重複讀在讀未提交、讀已提交隔離級別都可能出現

c. 幻讀

一個事務查詢某個條件查出記錄,之後別的事務對資料進行插入,那麼第一個事務再用同樣的條件查詢時得到的結果和一開始的到的結果不一致

不可重複讀在讀未提交、讀已提交、可重複讀隔離級別都可能出現

兩者區別?

對於前者,只需要鎖住滿足條件的記錄

對於後者,要鎖住滿足條件及其相近的記錄

不可重複讀重點在於update和delete,而幻讀的重點在於insert

事務的隔離級別

Mysql事務隔離級別有4個:讀未提交、讀已提交、可重複讀、可序列化

# 讀未提交

# 讀已提交

#可重複讀

session_2 讀 session_1 發生變更提交,並且自己也提交後才可以讀到session_1的變更

可以解決髒讀、不可重複度,但是不能解決幻讀問題

#可重複讀

四種級別比較