背景

成都創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元慶安做網(wǎng)站,已為上家服務(wù),為慶安各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575
數(shù)據(jù)庫的鎖是在多線程高并發(fā)的情況下用來保證數(shù)據(jù)穩(wěn)定性和一致性的一種機制。MySQL 根據(jù)底層存儲引擎的不同,鎖的支持粒度和實現(xiàn)機制也不同。MyISAM 只支持表鎖,InnoDB 支持行鎖和表鎖。目前 MySQL 默認(rèn)的存儲引擎是 InnoDB,這里主要介紹 InnoDB 的鎖。
使用 InnoDB 的兩大優(yōu)點:一是支持事務(wù);二是支持行鎖。
在高并發(fā)的情況下事務(wù)的并發(fā)處理會帶來幾個問題
由于高并發(fā)事務(wù)帶來這幾個問題,所以就產(chǎn)生了事務(wù)的隔離級別
舉個例子
按照上面 1,2,3,4 的順序執(zhí)行會發(fā)現(xiàn)第 4 步被阻塞了,必須執(zhí)行完第 5 步后才能插入成功。這里我們會很奇怪明明鎖住的是uid=6 的這一行,為什么不能插入 5 呢?原因就是這里采用了 next-key 的算法,鎖住的是(3,10)整個區(qū)間。感興趣的可以試一下。
今天給大家分享了一下 MySQL 的 InnoDB 的事務(wù)以及鎖的一些知識,通過自己的實際上手實踐對這塊更加熟悉了,希望大家在看的時候也可以動手試試,這樣更能體會,理解的更深刻。
mysql鎖機制是在并發(fā)操作的時候,避免多人同時操作而發(fā)生錯誤。
先說一下表級鎖吧
表級鎖 一般引擎都支持,資源消耗小。申請鎖的時候 整表鎖定(分讀寫鎖),其它線程或操作不能進行操作
行級鎖 INNODB引擎支持。資源消耗大 鎖定的時候 被鎖的行只能進行一個操作 其它均不能操作些行。
當(dāng)多個用戶訪問同一份數(shù)據(jù)時,一個用戶在更改數(shù)據(jù)的過程中,可能有其他用戶同時發(fā)起更改請求,為保證數(shù)據(jù)庫記錄的更新從一個一致性狀態(tài)變?yōu)榱硗庖粋€一致性狀態(tài),使用事務(wù)處理是非常必要的,事務(wù)具有以下四個特性:
MySQL 提供了多種事務(wù)型存儲引擎,如 InnoDB 和 BDB 等,而 MyISAM 不支持事務(wù)。為了支持事務(wù),InnoDB 存儲引擎引入了與事務(wù)處理相關(guān)的 REDO 日志和 UNDO 日志,同時事務(wù)依賴于 MySQL 提供的鎖機制
事務(wù)執(zhí)行時需要將執(zhí)行的事務(wù)日志寫入日志文件,對應(yīng)的文件為 REDO 日志。當(dāng)每條 SQL 進行數(shù)據(jù)更新操作時,首先將 REDO 日志寫進日志緩沖區(qū)。當(dāng)客戶端執(zhí)行 COMMIT 命令提交時,日志緩沖區(qū)的內(nèi)容將被刷新到磁盤,日志緩沖區(qū)的刷新方式或者時間間隔可以通過參數(shù) innodb_flush_log_at_trx_commit 控制
REDO 日志對應(yīng)磁盤上的 ib_logifleN 文件,該文件默認(rèn)為 5MB,建議設(shè)置為 512MB,以便容納較大的事務(wù)。MySQL 崩潰恢復(fù)時會重新執(zhí)行 REDO 日志的記錄,恢復(fù)最新數(shù)據(jù),保證已提交事務(wù)的持久性
與 REDO 日志相反,UNDO 日志主要用于事務(wù)異常時的數(shù)據(jù)回滾,具體內(nèi)容就是記錄數(shù)據(jù)被修改前的信息到 UNDO 緩沖區(qū),然后在合適的時間將內(nèi)容刷新到磁盤
假如由于系統(tǒng)錯誤或者 rollback 操作而導(dǎo)致事務(wù)回滾,可以根據(jù) undo 日志回滾到?jīng)]修改前的狀態(tài),保證未提交事務(wù)的原子性
與 REDO 日志不同的是,磁盤上不存在單獨的 UNDO 日志文件,所有的 UNDO 日志均存在表空間對應(yīng)的 .ibd 數(shù)據(jù)文件中,即使 MySQL 服務(wù)啟動了獨立表空間
在 MySQL 中,可以使用 BEGIN 開始事務(wù),使用 COMMIT 結(jié)束事務(wù),中間可以使用 ROLLBACK 回滾事務(wù)。MySQL 通過 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等語句支持本地事務(wù)
MySQL 定義了四種隔離級別,指定事務(wù)中哪些數(shù)據(jù)改變其他事務(wù)可見、哪些數(shù)據(jù)該表其他事務(wù)不可見。低級別的隔離級別可以支持更高的并發(fā)處理,同時占用的系統(tǒng)資源更少
InnoDB 系統(tǒng)級事務(wù)隔離級別可以使用以下語句設(shè)置:
查看系統(tǒng)級事務(wù)隔離級別:
InnoDB 會話級事務(wù)隔離級別可以使用以下語句設(shè)置:
查看會話級事務(wù)隔離級別:
在該隔離級別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。讀取未提交的數(shù)據(jù)稱為臟讀(Dirty Read),即是:首先開啟 A 和 B 兩個事務(wù),在 B 事務(wù)更新但未提交之前,A 事務(wù)讀取到了更新后的數(shù)據(jù),但由于 B 事務(wù)回滾,導(dǎo)致 A 事務(wù)出現(xiàn)了臟讀現(xiàn)象
所有事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變,此級別可以解決臟讀,但也會導(dǎo)致不可重復(fù)讀(Nonrepeatable Read):首先開啟 A 和 B 兩個事務(wù),A事務(wù)讀取了 B 事務(wù)的數(shù)據(jù),在 B 事務(wù)更新并提交后,A 事務(wù)又讀取到了更新后的數(shù)據(jù),此時就出現(xiàn)了同一 A 事務(wù)中的查詢出現(xiàn)了不同的查詢結(jié)果
MySQL 默認(rèn)的事務(wù)隔離級別,能確保同一事務(wù)的多個實例在并發(fā)讀取數(shù)據(jù)時看到同樣的數(shù)據(jù)行,理論上會導(dǎo)致一個問題,幻讀(Phontom Read)。例如,第一個事務(wù)對一個表中的數(shù)據(jù)做了修改,這種修改會涉及表中的全部數(shù)據(jù)行,同時第二個事務(wù)也修改這個表中的數(shù)據(jù),這次的修改是向表中插入一行新數(shù)據(jù),此時就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行
InnoDB 通過多版本并發(fā)控制機制(MVCC)解決了該問題:InnoDB 通過為每個數(shù)據(jù)行增加兩個隱含值的方式來實現(xiàn),這兩個隱含值記錄了行的創(chuàng)建時間、過期時間以及每一行存儲時間發(fā)生時的系統(tǒng)版本號,每個查詢根據(jù)事務(wù)的版本號來查詢結(jié)果
通過強制事務(wù)排序,使其不可能相互沖突,從而解決幻讀問題。簡而言之,就是在每個讀的數(shù)據(jù)行上加上共享鎖實現(xiàn),這個級別會導(dǎo)致大量的超時現(xiàn)象和鎖競爭,一般不推薦使用
為了解決數(shù)據(jù)庫并發(fā)控制問題,如走到同一時刻客戶端對同一張表做更新或者查詢操作,需要對并發(fā)操作進行控制,因此產(chǎn)生了鎖
共享鎖的粒度是行或者元組(多個行),一個事務(wù)獲取了共享鎖以后,可以對鎖定范圍內(nèi)的數(shù)據(jù)執(zhí)行讀操作
排他鎖的粒度與共享鎖相同,一個事務(wù)獲取排他鎖以后,可以對鎖定范圍內(nèi)的數(shù)據(jù)執(zhí)行寫操作
有兩個事務(wù) A 和 B,如果事務(wù) A 獲取了一個元組的共享鎖,事務(wù) B 還可以立即獲取這個元組的共享鎖,但不能獲取這個元組的排他鎖,必須等到事務(wù) A 釋放共享鎖之后。如果事務(wù) A 獲取了一個元組的排他鎖,事務(wù) B 不能立即獲取這個元組的共享鎖,也不能立即獲取這個元組的排他鎖,必須等到 A 釋放排他鎖之后
意向鎖是一種表鎖,鎖定的粒度是整張表,分為意向共享鎖和意向排他鎖。意向共享鎖表示一個事務(wù)有意對數(shù)據(jù)上共享鎖或者排他鎖。有意表示事務(wù)想執(zhí)行操作但還沒真正執(zhí)行
鎖的粒度主要分為表鎖和行鎖
表鎖的開銷最小,同時允許的并發(fā)量也是最小。MyISAM 存儲引擎使用該鎖機制。當(dāng)要寫入數(shù)據(jù)時,整個表記錄被鎖,此時其他讀/寫動作一律等待。一些特定的動作,如 ALTER TABLE 執(zhí)行時使用的也是表鎖
行鎖可以支持最大的并發(fā),InnoDB 存儲引擎使用該鎖機制。如果要支持并發(fā)讀/寫,建議采用 InnoDB 存儲引擎
分享題目:mysql鎖機制怎么用 mysql中鎖的機制有哪幾種
分享網(wǎng)址:http://chinadenli.net/article32/hjiisc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、搜索引擎優(yōu)化、網(wǎng)站營銷、Google、動態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)