什麼是事務?
老生常談:事務是邏輯上的一組操作,要麼都執行,要麼都不執行
經典執行個體:轉賬給你,我減少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的變更
可以解決髒讀、不可重複度,但是不能解決幻讀問題