什么是事務?
老生常談:事務是邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行
經典實例:轉賬給你,我減少100,你增加100,不能因為系統(tǒng)故障導致,我錢轉出了,而你沒收到
事務的四大特性
- A:原子性,最小執(zhí)行單位,要么都執(zhí)行,要么都不執(zhí)行
- C:一致性,?
- I:隔離性,并發(fā)訪問數據庫是,兩個事務是獨立的,
- D:持久性
串行執(zhí)行是不會事務執(zhí)行很順暢,但當不同事務同時執(zhí)行時可能出現各種情況,以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)
事務并發(fā)可能發(fā)生的情況
a. 臟讀
一個事務讀到另一個事務未提交的事務
session_2在session_1讀期間改了數據后,又回退了事務,導致session_1讀的數據根本不存在
臟讀只在讀未提交隔離級別才出現
b. 不可重復讀
一個事務中,可以讀到另一個事務已經提交的數據
不可重復讀在讀未提交、讀已提交隔離級別都可能出現
c. 幻讀
一個事務查詢某個條件查出記錄,之后別的事務對數據進行插入,那么第一個事務再用同樣的條件查詢時得到的結果和一開始的到的結果不一致
不可重復讀在讀未提交、讀已提交、可重復讀隔離級別都可能出現
兩者區(qū)別?
對于前者, 只需要鎖住滿足條件的記錄
對于后者, 要鎖住滿足條件及其相近的記錄
不可重復讀重點在于update和delete,而幻讀的重點在于insert
事務的隔離級別
Mysql事務隔離級別有4個:讀未提交、讀已提交、可重復讀、可串行化
# 讀未提交
# 讀已提交
#可重復讀
session_2 讀 session_1 發(fā)生變更提交,并且自己也提交后才可以讀到session_1的變更
可以解決臟讀、不可重復度,但是不能解決幻讀問題
#可重復讀
四種級別比較