SQL事務學習

一、概念

數據庫中的事物,指的是一連貫的sql指令。要麼全部執行完成,一旦中途有一個位置的sql指令執行失敗則整個事物內的操作全體回滾,即全部執行失敗。


舉例來說,我要從A銀行賬戶轉400元到B銀行賬戶,要麼轉賬成功A賬戶減少400元並B賬戶多400元(手續費之類的就不要考慮了),要麼轉賬失敗,A賬戶被退回400元,B賬戶金額不變。

真是的案例就是我曾經去建設銀行ATM機取款2000元,取款過程中短信通知發過來說我賬戶取出2000元,但是ATM機卻報了異常,讓我聯繫銀行。我頓時心就慌了,差點卡忘了拿走,過來1分鐘後又收到了銀行的短信,賬戶退回2000元。如果沒有事物,那是多麼可怕的一件事啊!


、事物的四大特

1.原子性:

就同概念說的一樣,要麼全部執行完成,要麼回滾即全部執行失敗。


2.一致性:

還是拿轉賬舉例,A、B兩個賬戶總金額是800元,這兩個賬戶之間轉賬,無論怎麼轉A+B的金額還是800,多或少。


3.隔離性:

當多個用戶併發的向數據庫發生訪問時,數據庫爲每一個用戶分別開啓一個事務,事務與事務的數據是不允許相互干擾的。


4.持久性:

一旦事物提交(commit)完成,數據就永久保存了,不會再受任何情況下影響。


三、隔離性詳解

1.如果不隔離的話,存在的問題

a.髒讀:

AB兩個事務併發開啓,A事務讀取到了B事務還未提交(commit)的數據。


b.幻讀(虛讀):

AB兩個事物併發開啓,B事務insert一條記錄,但B事務爲提交,A事務讀取到了這條記錄,但是B事務回滾了,A事務再查詢的時候這條記錄又消失了。和前一個髒讀很像,但是髒讀是提前多讀出來記錄,而幻讀是讀出來之後又消失了。


c.不可復讀:

A事務開啓後,select一條記錄,因爲沒有加鎖所以此時有可能別的地方正在修改這條記錄,A事務再select這條記錄時,發現數據與之前的內容不一樣了。注意,不可復讀不是錯誤,而是現象。


2.爲了解決以上三種問題,有下面這四種隔離級別

a.可序列化(serializable):隔離級別最高,可以避免以上三種問題,但是由於單線程所以性能最低。


b.可重複讀(repeatable read):可以避免不可復讀、髒讀,但是不能避免幻讀。


c.已提交讀(read committed):可以避免髒讀,但是不能避免不可復讀、幻讀。


d.未提交讀(read uncommitted):不設置隔離,三種問題都會發生,但是是性能最高。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章