事務的定義?
事務是數(shù)據(jù)庫系統(tǒng)中執(zhí)行過程中的一個邏輯單位,由一個有限的數(shù)據(jù)庫操作部分構成.
解釋:
1.這個邏輯單位實際上是數(shù)據(jù)庫最小工作單元,不可再分.
2.有限的步驟就是說可能是一個sql或者多個sql的執(zhí)行
事務的基本要素(ACID)
- 原子性(Atomicity):事務開始后所有操作,要么全部成功,要么全部失敗
例如:A給B轉賬,A余額減少100,對應B增加100,這兩個必須同時成功(提交事務)或失敗(回滾事務).
- 一致性(Consistency):事務開始到結束的約束完整性沒有被破壞.
例如,主鍵唯一約束,字段定義長度約束,這里約束是數(shù)據(jù)庫本身層面的;
還有就是業(yè)務方面的約束,例如A給B轉賬,A余額減少100,對應B增加50,雖然保證了原子性,但是破壞了約束.導致數(shù)據(jù)前后不一致.
3.隔離性(Isolation),當有了多個事務之后,那么多個事務應當是完全隔離開來的,他們互不干擾.但是當多個事務同時操作一個數(shù)據(jù)時,也要保證事務的透明性
4.持久性(Durable),對數(shù)據(jù)庫的操作,只要事務是成功的,那么結果就是永久性的,不可能因為其他原因導致數(shù)據(jù)不正確.例如當數(shù)據(jù)庫宕機,持久性通過red log和double write雙寫緩沖來實現(xiàn),我們操作數(shù)據(jù)的時候會寫到內存中,同時也會記錄redo log,如果再寫入磁盤之前出異常,在重啟之后就可以讀取redo log的內容寫入磁盤中,保證數(shù)據(jù)永久性.
事務并發(fā)帶來的四個問題(臟讀,不可重復讀/幻讀/數(shù)據(jù)丟失)
1.臟讀(臟讀臟讀顧名思義是讀出了問題,讀了別人沒有提交的數(shù)據(jù))
假如小名明賬戶有100元,這里有兩個事務A,B;在A事務查看賬戶時是100,然后這個時候B事務將100改成了200元,但是事務B還沒提交,恰巧這時A又去看了自己賬戶發(fā)現(xiàn)錢變成了200元,如果這時候B回滾事務.那么讀取的數(shù)據(jù)就是臟數(shù)據(jù).這種現(xiàn)象總結下來就是A事務讀取了B還沒有提交的事務,稱作臟讀.
2不可重復讀(多次讀取同一個數(shù)據(jù)發(fā)現(xiàn)結果不一致)
在一次事務中的多次查詢同一數(shù)據(jù)發(fā)現(xiàn)查詢結果不一致.
3.幻讀(兩次查詢結果發(fā)現(xiàn)條數(shù)不一致)
在一個事務中可能有人提交了新的數(shù)據(jù),導致查詢結果數(shù)據(jù)量不一致
4.數(shù)據(jù)丟失
兩次更新操作可能會覆蓋上一次數(shù)據(jù)的寫入,導致數(shù)據(jù)丟失問題.
對于事務帶來的問題的解決方案(四種隔離級別)
SQL標準定義了四種隔離級別:
Read Uncommitted(讀取未提交內容)
在一個事務中沦补,可以讀取到其他事務未提交的數(shù)據(jù)變化,這種讀取其他會話還沒提交的事務挽拔,叫做臟讀現(xiàn)象涝开,在生產(chǎn)環(huán)境中切勿使用羡榴。
Read Committed(讀取提交內容)
在一個事務中,可以讀取到其他事務已經(jīng)提交的數(shù)據(jù)變化,這種讀取也就叫做不可重復讀益愈,因為兩次同樣的查詢可能會得到不一樣的結果户誓。
Repeatable Read(可重讀)
MySQL默認隔離級別饼灿,在一個事務中,直到事務結束前帝美,都可以反復讀取到事務剛開始時看到的數(shù)據(jù)碍彭,并一直不會發(fā)生變化,避免了臟讀悼潭、不可重復讀現(xiàn)象庇忌,但是它還是無法解決幻讀問題。
Serializable(可串行化)
這是最高的隔離級別舰褪,它強制事務串行執(zhí)行皆疹,避免了前面說的幻讀現(xiàn)象,簡單來說占拍,它會在讀取的每一行數(shù)據(jù)上都加鎖墙基,所以可能會導致大量的超時和鎖爭用問題。
目前mysql默認使用可重復讀隔離級別.