mysql 事务原理 mvcc_MySql事务以及MVCC机制与原理
事務
事務是一組原子性sql查詢語句,被當作一個工作單元。若MySQL對改事務單元內的所有sql語句都正常的執行完,則事務操作視為成功,所有的sql語句才對數據生效,若sql中任意不能執行或出錯則事務操作失敗,所有對數據的操作則無效(通過回滾恢復數據)。
事務有四個屬性原子性:事務被認為不可分的一個工作單元,要么全部正常執行,要么全部不執行。
一致性:事務操作對數據庫總是從一種一致性的狀態轉換成另外一種一致性狀態。
隔離性:一個事務的操作結果在內部一致,可見,而對除自己以外的事務是不可見的。
永久性:事務在未提交前數據一般情況下可以回滾恢復數據,一旦提交(commit)數據的改變則變成永久(當然用update肯定還能修改)。
多事務運行時的并發問題第一類丟失更新:撤銷一個事務時,把其他事務已提交的更新數據覆蓋;
臟讀:一個事務讀到另一個事務未提交的更新數據;
虛讀:一個事務讀到另一個事務已提交的新插入的數據;
不可重復讀:一個事務讀到另一個事務已提交的更新數據;
第二類丟失更新:這是不可重復讀中的特例,一個事務覆蓋另一個事務已提交的更新數據。
數據庫鎖
共享鎖
用于讀數據操作,他是非獨占的,允許其他事務同時讀取其鎖定的資源,但不允許其他事務更新他。加鎖條件:當一個事務執行select語句時。
解鎖條件:默認情況下,數據讀取后,數據庫系統立即釋放共享鎖。
兼容性:放置共享鎖后還可放置共享鎖和更新鎖。
并發性:具有良好的并發性能。當多個事務讀取相同的數據時,每個事務都會獲得一把共享鎖,因此可以同時讀鎖定的數據。
獨占鎖
也叫排他鎖,使用與修改數據的場合。他鎖定的資源,其他事務不能進行讀寫。加鎖條件:當一個事務執行insert,update,delete時,數據庫系統會自動對被操作的數據使用獨占鎖。如果該數據已有其他鎖存在,則不能放置獨占鎖。
解鎖條件:事務結束。
兼容性:不和其他鎖兼容。
并發性:并發性差,只允許有一個事務訪問鎖定數據。其他事務需等待,直到當前事務結束。
更新鎖
更新操作的初始階段用來鎖定可以能要被修改資源的鎖。更新鎖可避免使用共享鎖造成的死鎖現象。加鎖條件:當執行update時,數據庫系統會先為事務分配一個更新鎖。
解鎖條件:當讀取數據完畢,執行更新操作時,更新鎖升級為獨占鎖。
兼容性:與共享鎖兼容。一個資源可同時放置更新鎖和共享鎖,但只能放置一把更新鎖。
并發性:允許多個事務同時讀鎖定的資源,但不允許其他事務修改。
讀鎖
也叫共享鎖、S鎖,若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S 鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
寫鎖
又稱排他鎖、X鎖。若事務T對數據對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。
表鎖
操作對象是數據表。Mysql大多數鎖策略都支持(常見mysql innodb),是系統開銷最低但并發性最低的一個鎖策略。事務t對整個表加讀鎖,則其他事務可讀不可寫,若加寫鎖,則其他事務增刪改都不行。
行級鎖
操作對象是數據表中的一行。是MVCC技術用的比較多的,但在MYISAM用不了,行級鎖用mysql的儲存引擎實現而不是mysql服務器。但行級鎖對系統開銷較大,處理高并發較好。
MVCC
多版本并發控制(MVCC,Multiversion Currency Control)。一般情況下,事務性儲存引擎不是只使用表鎖,行加鎖的處理數據,而是結合了MVCC機制,以處理更多的并發問題。Mvcc處理高并發能力最強,但系統開銷比最大(較表鎖、行級鎖),這是最求高并發付出的代價。
如何防止死鎖合理安排表訪問順序;
使用短事務(包含盡可能少的能在短時間內完成操作的事務);將事務分解為多個小事務,讓后分別執行。這樣可保證每個小事務的快速完成,減少對數據資源鎖定的時間;減少執行事務過程中等待需要更新的數據。
如果對數據要求不高,可以允許臟讀。臟讀不需要對數據資源加鎖,可以避免鎖沖突;
如果可能,錯開多個事務訪問相同數據資源的時間,防止鎖沖突;
使用盡可能低的事務隔離級別。
數據庫事務隔離級別Serializalble: 串行化。一個事務在執行過程完全看不到其他事務對數據庫所做的更新。當兩個事務同時訪問相同數據時,第一個事務必須等第二個事務完成后才能訪問。
Repeatable Read: 可重復讀。事務在執行過程中可以看到其他事務已提交的新插入記錄,但不能看到其他事務已提交的對已有記錄的更新。
Read Committed: 讀已提交數據。事務在執行過程中可以看到其他事務已提交的新插入記錄,也可看到其他事務已提交的對已有記錄的更新。
Read Uncommited: 讀未提交數據。事務在執行過程既可以看到其他事務沒有提交的新插入數據,也可看到其他事務已經提交的對已有記錄的更新。
其中Serializalble的隔離級別最高,但并發性能最差。而Read Uncommited的隔離級別最低,但并發性能最好。隔離級別越高,越能保證數據的完整性和一致性,但并發性能則會降低。對于多數程序,可以優先考慮把數據庫系統的隔離級別設置為Read Committed,它可以避免臟讀,而且具有較好的并發性能。
總結
以上是生活随笔為你收集整理的mysql 事务原理 mvcc_MySql事务以及MVCC机制与原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓浏览器解析apk文件 大小信息_ap
- 下一篇: mysql使用混合引擎如何,mysql