MySql 事務
目錄
目錄
什么是事務(transaction)
- 保證成批操作要么完全執行,要么完全不執行,維護數據的完整性。也就是要么成功要么失敗。
- 事務可以是n條sql語句(n>=0)
- 不是所有數據庫引擎支持事務,InnoDB引擎支持事務處理
事務四大特性
- 原子性(Atomic):事務的所有所有操作要么全部執行,要么全部不執行。如果中途出現錯誤不會停止,而是回滾到事務前的狀態
- 一致性(Consistency):如果事務執行前是一致的,那么執行后也是一致的,不能破壞關系數據的完整性以及業務邏輯上的一致性,事務按照預期實現。
- 隔離性(Isolation):隔離性可以防止多個事務並發時導致數據的不一致
- 持久性(Durability):事務執行成功后對數據庫的修改是永久的
事務並發不進行事務隔離
- 臟讀:事務A讀到未提交事務B修改的數據,如果此時事務B中途執行失敗回滾,那么此時事務A讀取到的就是臟數據。比如事務A對money進行修改,此時事務B讀取到事務A的更新結果,但是如果后面事務A回滾,那么事務B讀取到的就是臟數據了。
- 不可重復讀:同一個事務中,對同一份數據讀取的結果不一致。事務A在事務B對數據更新前進行讀取,然后事務B更新提交,事務A再次讀取,這時候兩次讀取的數據不同。
- 幻讀:同一個事務中,同一個查詢多次返回的結果不一樣。事務B查詢表的記錄數,然后事務A對表插入一條記錄,接着事務B再次查詢發現記錄數不同。
區別
- 臟讀和不可重復讀:臟讀是事務讀取了還未提交事務的更新數據。不可重復讀是同一個事務中,幾次讀取的數據不同。
- 不可重復讀和幻讀的區別:都是在同一個事務中,前者是幾次讀取數據不同,后者是幾次讀取數據整體不同。
隔離級別
隔離級別 | 作用 |
---|---|
Serializable(串行化) | 避免臟讀、不可重復讀、幻讀 |
Repeatable(可重復讀) | 避免臟讀、不可重復讀 |
Read committed(讀已提交) | 避免臟讀 |
Read uncommitted(讀未提交) | none |
- mysql支持上面4種隔離級別,默認為可重復讀
事務的使用
start transcation;
delete from user;
savepoint dele;
****
rollback dele;
commit;
- transcation 事務開始
- rollback 回滾到事務起點
- savepoint 保留回滾位置
- rollback point_name 回滾到設置的位置
使用注意點
- 如果事務中sql正確運行,后面沒有commit,結果是不會更新到數據庫的,所以需要手動添加commit。
- 如果事務中部分sql語句出現錯誤,那么錯誤語句后面不會執行。而我們可能會認為正確操作會回滾撤銷,但是實際上並沒有撤銷正確的操作,此時如果再無錯情況下進行一次commit,之前的正確操作會生效,數據庫會進行更新。
我覺得分享是一種精神,分享是我的樂趣所在,不是說我覺得我講得一定是對的,我講得可能很多是不對的,但是我希望我講的東西是我人生的體驗和思考,是給很多人反思,也許給你一秒鍾、半秒鍾,哪怕說一句話有點道理,引發自己內心的感觸,這就是我最大的價值。(這是我喜歡的一句話,也是我寫博客的初衷)
作者:jiajun 出處: http://www.cnblogs.com/-new/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。如果覺得還有幫助的話,可以點一下右下角的【推薦】,希望能夠持續的為大家帶來好的技術文章!想跟我一起進步么?那就【關注】我吧。