什么是事務(wù)?
老生常談:事務(wù)是邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行
經(jīng)典實(shí)例:轉(zhuǎn)賬給你,我減少100,你增加100,不能因?yàn)橄到y(tǒng)故障導(dǎo)致,我錢轉(zhuǎn)出了,而你沒收到
事務(wù)的四大特性
- A:原子性,最小執(zhí)行單位,要么都執(zhí)行,要么都不執(zhí)行
- C:一致性,?
- I:隔離性,并發(fā)訪問數(shù)據(jù)庫(kù)是,兩個(gè)事務(wù)是獨(dú)立的,
- D:持久性
串行執(zhí)行是不會(huì)事務(wù)執(zhí)行很順暢,但當(dāng)不同事務(wù)同時(shí)執(zhí)行時(shí)可能出現(xiàn)各種情況,以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;
# 初始數(shù)據(jù)
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)
事務(wù)并發(fā)可能發(fā)生的情況
a. 臟讀
一個(gè)事務(wù)讀到另一個(gè)事務(wù)未提交的事務(wù)

session_2在session_1讀期間改了數(shù)據(jù)后,又回退了事務(wù),導(dǎo)致session_1讀的數(shù)據(jù)根本不存在
臟讀只在讀未提交隔離級(jí)別才出現(xiàn)
b. 不可重復(fù)讀

一個(gè)事務(wù)中,可以讀到另一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù)
不可重復(fù)讀在讀未提交、讀已提交隔離級(jí)別都可能出現(xiàn)
c. 幻讀

一個(gè)事務(wù)查詢某個(gè)條件查出記錄,之后別的事務(wù)對(duì)數(shù)據(jù)進(jìn)行插入,那么第一個(gè)事務(wù)再用同樣的條件查詢時(shí)得到的結(jié)果和一開始的到的結(jié)果不一致
不可重復(fù)讀在讀未提交、讀已提交、可重復(fù)讀隔離級(jí)別都可能出現(xiàn)
兩者區(qū)別?
對(duì)于前者, 只需要鎖住滿足條件的記錄
對(duì)于后者, 要鎖住滿足條件及其相近的記錄
不可重復(fù)讀重點(diǎn)在于update和delete,而幻讀的重點(diǎn)在于insert
事務(wù)的隔離級(jí)別
Mysql事務(wù)隔離級(jí)別有4個(gè):讀未提交、讀已提交、可重復(fù)讀、可串行化
# 讀未提交

# 讀已提交

#可重復(fù)讀

session_2 讀 session_1 發(fā)生變更提交,并且自己也提交后才可以讀到session_1的變更
可以解決臟讀、不可重復(fù)度,但是不能解決幻讀問題
#可重復(fù)讀

四種級(jí)別比較
