MySQL事務(wù)的四大特性以及并發(fā)事務(wù)問題解讀
MySQL事務(wù)的四大特性以及并發(fā)事務(wù)
事務(wù)的四大特性ACID
原子性(Atomicity):
- 事務(wù)是不可分割的最小單元,要么全部成功,要么全部失敗。
- (eg:轉(zhuǎn)賬案例,轉(zhuǎn)賬過程中任何一步操作失敗了,那么整個(gè)事務(wù)就失敗了)
一致性(Consistency):
- 事務(wù)完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)。
- (不管是事務(wù)執(zhí)行成功提交,還是事務(wù)執(zhí)行失敗回滾了,張三李四賬戶余額加起是一個(gè)恒定值。轉(zhuǎn)賬前總和6000,轉(zhuǎn)賬后不可能出現(xiàn)兩個(gè)人的賬戶總和8000)
隔離性(Isolation):
- 數(shù)據(jù)庫系統(tǒng)提供的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的獨(dú)立環(huán)境下運(yùn)行。
- (隔離性是指:有并發(fā)個(gè)事務(wù),事務(wù)A、事務(wù)B同時(shí)操作數(shù)據(jù)庫,A事務(wù)在操作的時(shí)候不會(huì)影響B(tài)事務(wù)的執(zhí)行;同理B事務(wù)在操作的時(shí)候,也不會(huì)影響A事務(wù)的執(zhí)行。它們兩個(gè)事務(wù)在獨(dú)立的環(huán)境下運(yùn)行的,互不影響。)
持久性(Persistence):
- 事務(wù)一旦提交或回滾,它對(duì)數(shù)據(jù)庫中的數(shù)據(jù)改變就是永久的。
- (不管是事務(wù)執(zhí)行成功提交了,還是操作異?;貪L了,它對(duì)數(shù)據(jù)庫的改變時(shí)永久的,因?yàn)閿?shù)據(jù)庫的數(shù)據(jù)最終是存儲(chǔ)在磁盤的,那么存儲(chǔ)在磁盤的數(shù)據(jù)它會(huì)被永久的保留下來)
事務(wù)-并發(fā)事務(wù)問題
臟讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)還沒有提交的數(shù)據(jù)。
不可重復(fù)讀:一個(gè)事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,稱之為不可重復(fù)讀。
幻讀: 一個(gè)事務(wù)按照條件查詢事務(wù)時(shí),沒有對(duì)應(yīng)的數(shù)據(jù)行,但是在插入數(shù)據(jù)時(shí),又發(fā)現(xiàn)這行數(shù)據(jù)已存在,好像出現(xiàn)了幻影。
并發(fā)事務(wù)出現(xiàn)的問題-圖文描述:
臟讀:
- B事務(wù)讀取A事務(wù)修改后(update后)未提交的數(shù)據(jù);
- 事務(wù)A對(duì)id=1 的數(shù)據(jù)進(jìn)行了修改,且修改后還未提交事務(wù),此時(shí)事務(wù)B查詢id=1的數(shù)據(jù),查到的數(shù)據(jù)是事務(wù)B修改后未提交的數(shù)據(jù)。這種情況稱之為臟讀。
不可以重復(fù)讀:
- A事務(wù)一共有4個(gè)操作,第一步時(shí)查詢數(shù)據(jù)庫id=1的數(shù)據(jù),第二步執(zhí)行其他操作時(shí),此時(shí)B事務(wù)對(duì)id=1的數(shù)據(jù)進(jìn)行修改(注:并發(fā)事務(wù)),修改后提交事務(wù)。
- A事務(wù)執(zhí)行第三步查詢id=1的數(shù)據(jù)時(shí),和第一步查詢id=1的返回結(jié)果不一樣(因?yàn)锽事務(wù)對(duì)id=1的數(shù)據(jù)進(jìn)行了修改),這種情況稱之為不可以重復(fù)讀。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Centos7下安裝MySQL8.0.23的步驟(小白入門級(jí)別)
這篇文章主要介紹了Centos7下安裝MySQL8.0.23的步驟(小白入門級(jí)別),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01mysql表優(yōu)化、分析、檢查和修復(fù)的方法詳解
這篇文章主要介紹了mysql表優(yōu)化、分析、檢查和修復(fù)的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了MySQL表進(jìn)行優(yōu)化,分析與修復(fù)等操作的各種常見命令與使用技巧,需要的朋友可以參考下2016-04-04淺談sql語句中GROUP BY 和 HAVING的使用方法
GROUP BY語句和HAVING語句,經(jīng)過研究和練習(xí),終于明白如何使用了,在此記錄一下同時(shí)添加了一個(gè)自己舉的小例子,通過寫這篇文章來加深下自己學(xué)習(xí)的效果,還能和大家分享下,同時(shí)也方便以后查閱,一舉多得,下面由小編來和大家一起學(xué)習(xí)2019-05-05MySQL 8.0統(tǒng)計(jì)信息不準(zhǔn)確的原因
這篇文章主要介紹了MySQL 8.0統(tǒng)計(jì)信息不準(zhǔn)確的原因,幫助大家更好的理解和學(xué)習(xí)MySQL8.0的相關(guān)內(nèi)容,感興趣的朋友可以了解下2020-08-08關(guān)于數(shù)據(jù)庫中保留小數(shù)位的問題
本篇文章是對(duì)關(guān)于在數(shù)據(jù)庫中保留小數(shù)位的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07mysql實(shí)現(xiàn)事務(wù)的提交和回滾實(shí)例
這篇文章主要介紹了mysql實(shí)現(xiàn)事務(wù)的提交和回滾,需要的朋友可以參考下2014-06-06為什么MySQL選擇Repeatable Read作為默認(rèn)隔離級(jí)別
關(guān)于MySQL的事務(wù)隔離級(jí)別,相信很多讀者都不陌生,那么,你知道為什么Oracle選擇RC作為默認(rèn)級(jí)別,而MySQL要選擇RR作為默認(rèn)的隔離級(jí)別嗎2021-07-07