什么是事物(transaction)?
事務(wù)是一條或多條DML數(shù)據(jù)庫(kù)操作語(yǔ)句的集合峭状,在事務(wù)中的操作克滴,要么都執(zhí)行,要么都不執(zhí)行优床。
為什么要使用事物呢?
比如說(shuō):用戶A給用戶B轉(zhuǎn)賬5000元主要步驟可以概括為以下幾步:
檢測(cè)A賬戶余額 > 5000元
A賬戶余額減去 5000元
B賬戶余額增加 5000元
這幾步要么都成功劝赔,要么一個(gè)都不成功,否則都會(huì)導(dǎo)致數(shù)據(jù)不一致(5000元不翼而飛)胆敞。這就可以用到事務(wù)來(lái)保證.
Mysql支持事物嗎?
Mysql有多個(gè)存儲(chǔ)引擎着帽,5.5版本以上默認(rèn)是使用InnoDB作為存儲(chǔ)引擎,通過(guò)下圖可以發(fā)現(xiàn)Mysql在不改變存儲(chǔ)引擎的情況下是支持事物的杂伟。
點(diǎn)擊查看Mysql多個(gè)存儲(chǔ)引擎的不同
事物的四大特性(ACID)
- 原子性(Atomicity),事務(wù)是最小單元仍翰,不可再分赫粥。
- 一致性(Consistency),事務(wù)要求所有的DML語(yǔ)句操作的時(shí)候予借,必須保證同時(shí)成功或同時(shí)失敗越平。
- 隔離性(Isolation),一個(gè)事務(wù)不會(huì)影響其他事務(wù)的執(zhí)行灵迫。
- 持久性(Durability)喧笔,在事務(wù)完成之后,該事務(wù)對(duì)數(shù)據(jù)庫(kù)所作的更改將持久地保存在數(shù)據(jù)庫(kù)中龟再,并不會(huì)被回滾书闸。
事物的隔離級(jí)別
- read uncommitted 讀未提交
事務(wù)A和事務(wù)B,事務(wù)A未提交的數(shù)據(jù)利凑,事務(wù)B可以讀取浆劲,這里讀取到的數(shù)據(jù)叫做“臟數(shù)據(jù)”,該級(jí)別最低哀澈,一般只是理論上存在牌借,數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別都高于該級(jí)別。- read committed 讀已提交
事務(wù)A和事務(wù)B割按,事務(wù)A提交的數(shù)據(jù)膨报,事務(wù)B才可讀取到,換句話說(shuō):對(duì)方事務(wù)提交之后的數(shù)據(jù)适荣,當(dāng)前事務(wù)才可讀取到现柠,可以避免讀取“臟數(shù)據(jù)”,但是該級(jí)別會(huì)有“不可重復(fù)讀”的問(wèn)題弛矛,事務(wù)B讀取一條數(shù)據(jù)够吩,當(dāng)事務(wù)A修改這條數(shù)據(jù)并提交后,事務(wù)B再讀取這條數(shù)據(jù)時(shí)丈氓,數(shù)據(jù)發(fā)生了變化周循,即事務(wù)B每次讀取的數(shù)據(jù)有可能不一致,這種情況叫做“不可重復(fù)讀”万俗。- repeatable read 重復(fù)讀
MySQL默認(rèn)的隔離級(jí)別是重復(fù)讀湾笛,該級(jí)別可以達(dá)到“重復(fù)讀”的效果,但是會(huì)有“幻讀”的問(wèn)題闰歪,即事務(wù)A讀取數(shù)據(jù)嚎研,此時(shí)事務(wù)B修改了這條數(shù)據(jù),但是事務(wù)A讀取的還是之前的舊數(shù)據(jù)的內(nèi)容课竣,這樣就出現(xiàn)了幻讀嘉赎。- serializable 串行化
事務(wù)A和事務(wù)B置媳,事務(wù)A在操作數(shù)據(jù)庫(kù)表中數(shù)據(jù)的時(shí)候于樟,事務(wù)B只能排隊(duì)等待公条,這樣保證了同一個(gè)時(shí)間點(diǎn)上只有一個(gè)事務(wù)操作數(shù)據(jù)庫(kù),該級(jí)別可以解決“幻讀”的問(wèn)題迂曲。但是這種級(jí)別一般很少使用靶橱,因?yàn)橥掏铝刻停脩趔w驗(yàn)不好路捧。