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