這篇文章主要介紹“MySQL InnoDB事務與鎖的詳細講解”,在日常操作中,相信很多人在MySQL InnoDB事務與鎖的詳細講解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL InnoDB事務與鎖的詳細講解”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
十載的曲松網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。網絡營銷推廣的優(yōu)勢是能夠根據用戶設備顯示端的尺寸不同,自動調整曲松建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“曲松網站設計”,“曲松網站推廣”以來,每個客戶項目都認真落實執(zhí)行。
引題:為何引入事務?
1>.數(shù)據完整性
2>.數(shù)據安全性
3>.充分利用系統(tǒng)資源,提高系統(tǒng)并發(fā)處理的能力
1. 事務的特征
事務具有四個特性:原子性(Atomiocity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),這四個特性簡稱ACID特性.
1.1原子性
事務是數(shù)據庫的邏輯工作單位,事務中包括的所有操作要么都做,要么都不做.
1.2 一致性
事務執(zhí)行的結果必須是使數(shù)據庫從一個一致性的狀態(tài)變到另外一個一致性狀態(tài).
1.3 隔離性
一個事務的執(zhí)行不能被其他事務干擾.即一個事務內部的操作及使用的數(shù)據對其他
事務是隔離的,并發(fā)執(zhí)行的各個事務之間互相不干擾.
1.4 持久性
一個事務一旦成功提交,對數(shù)據庫中數(shù)據的修改就是持久性的.接下來其他的其他
操作或故障不應該對其執(zhí)行結果有任何影響.
2. MySQL的InnoDB引擎中事物與鎖
2.1 SELECT …… LOCK IN SHARE MODE
會話事務中查找的數(shù)據,加上一個共享鎖.若會話事務中查找的數(shù)據已經被其他會話事務加上獨占鎖的話,共享鎖會等待其結束再加,若等待時間過長就會顯示事務需要的鎖等待超時.
2.2 SELECT ….. FOR UPDATE
會話事務中查找的數(shù)據,加上一個讀更新瑣,其他會話事務將無法再加其他鎖,必須等待其結束.
2.3 INSERT、UPDATE、DELETE
會話事務會對DML語句操作的數(shù)據加上一個獨占鎖,其他會話的事務都將會等待其釋放獨占鎖.
2.4 gap and next key lock(間隙鎖)
InnoDB引擎會自動給會話事務中的共享鎖、更新瑣以及獨占鎖,需要加到一個區(qū)間值域的時候,再加上個間隙鎖(或稱范圍鎖),對不存在的數(shù)據也鎖住,防止出現(xiàn)幻寫.
備注:
以上2.1,2.2,2.3,2.4中描述的情況,跟MySQL所設置的事務隔離級別也有關系.
3.四種事務隔離模式
3.1 READ UNCOMMITED
SELECT的時候允許臟讀,即SELECT會讀取其他事務修改而還沒有提交的數(shù)據.
3.2 READ COMMITED
SELECT的時候無法重復讀,即同一個事務中兩次執(zhí)行同樣的查詢語句,若在第一次與第二次查詢之間時間段,其他事務又剛好修改了其查詢的數(shù)據且提交了,則兩次讀到的數(shù)據不一致.
3.3 REPEATABLE READ
SELECT的時候可以重復讀,即同一個事務中兩次執(zhí)行同樣的查詢語句,得到的數(shù)據始終都是一致的.
3.4 SERIALIZABLE
與可重復讀的唯一區(qū)別是,默認把普通的SELECT語句改成SELECT …. LOCK IN SHARE MODE.即為查詢語句涉及到的數(shù)據加上共享瑣,阻塞其他事務修改真實數(shù)據.
4. 驗證事務與鎖定示例
接下來,我們將以MySQL中的InnoDB引擎,解釋其如何實現(xiàn)ACID特性,不同隔離級別下事務與事務之間的影響.示例表結構:
CREATE TABLE `account ` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`VACCOUNT_ID` varchar(32) NOT NULL,
`GMT_CREATE` datetime NOT NULL,
PRIMARY KEY (`ID`),
KEY `idx_VACCOUNT_PARAMETER_VACCOUNTID ` (`VACCOUNT_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
然后向表account中寫入10W條創(chuàng)建日期分布合理的帳號數(shù)據,以方便測試之用.
tx_isolation:SET GLOBAL tx_isolation='read-uncommitted'
ID 事務1 事務1輸出 事務2 事務2輸出
1 START TRANSACTION;
2 SELECT VACCOUNT_ID from account where ID =1001; caimao101510
START TRANSACTION;
3
UPDATE account set VACCOUNT_ID='uncommitted' where ID =1001;
4
SELECT VACCOUNT_ID from account where ID =1001; uncommitted
5 SELECT VACCOUNT_ID from account where ID =1001; uncommitted
6
ROLLBACK;
7 SELECT VACCOUNT_ID from account where ID =1001; caimao101510
8 COMMIT;
tx_isolation:SET GLOBAL tx_isolation='read-committed'
ID 事務1 事務1輸出 事務2 事務2輸出
1 START TRANSACTION;
2 SELECT VACCOUNT_ID from account where ID =1001; caimao101510
3
START TRANSACTION;
4
UPDATE account set VACCOUNT_ID='uncommitted' where ID =1001;
5
SELECT VACCOUNT_ID from account where ID =1001; uncommitted
6 SELECT VACCOUNT_ID from account where ID =1001; caimao101510
7
COMMIT;
8 SELECT VACCOUNT_ID from account where ID =1001; uncommitted
9 COMMIT;
tx_isolation:SET GLOBAL tx_isolation='REPEATABLE-READ'
到此,關于“MySQL InnoDB事務與鎖的詳細講解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網站欄目:MySQLInnoDB事務與鎖的詳細講解
網站URL:http://weahome.cn/article/gdodes.html