日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql锁与事务

發(fā)布時間:2025/6/17 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql锁与事务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

一、RDBMS數(shù)據(jù)組織

RDBMS中數(shù)據(jù)組織涉及到兩個最基本的結(jié)構(gòu):表與索引。表中存儲的是完整記錄,一般有兩種組織形式:堆表(所有的記錄無序存儲,如Oracle/DB2/PostgreSQL),或者是聚簇索引表(所有的記錄,按照記錄主鍵進行排序存儲,如InnoDB引擎)。索引中存儲的是完整記錄的一個子集,用于加速記錄的查詢速度,索引的組織形式,一般均為B+樹結(jié)構(gòu)。

二、RDBMS鎖的原則

2PL(二階段鎖Two-Phase Locking):傳統(tǒng)RDBMS加鎖的一個原則,就是2PL,說的是鎖操作分為兩個階段:加鎖階段與解鎖階段,并且保證加鎖階段與解鎖階段不相交。下面以MySQL為例,來簡單看看2PL在MySQL中的實現(xiàn)。

從上圖可以看出,2PL就是將加鎖/解鎖分為兩個完全不相交的階段。加鎖階段:只加鎖,不放鎖。解鎖階段:只放鎖,不加鎖。所以JDBC Connection需要通過commit/rollback來提交或者釋放鎖。

三、MVCC

MySQL是一個支持插件式存儲引擎的數(shù)據(jù)庫系統(tǒng)。不同引擎的表現(xiàn),會有較大的區(qū)別。InnoDB存儲引擎實現(xiàn)的是基于多版本的并發(fā)控制協(xié)議——MVCC (Multi-Version Concurrency Control) (注:與MVCC相對的,是基于鎖的并發(fā)控制,Lock-Based Concurrency Control)。

MVCC最大的好處,讀不加鎖,讀寫不沖突。在讀多寫少的OLTP應(yīng)用中,讀寫不沖突是非常重要的,極大的增加了系統(tǒng)的并發(fā)性能,這也是為什么現(xiàn)階段,幾乎所有的RDBMS,都支持了MVCC。

在MVCC并發(fā)控制中,讀操作可以分成兩類:快照讀 (snapshot read)與當前讀 (current read)。快照讀,讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖。當前讀,讀取的是記錄的最新版本,并且,當前讀返回的記錄,都會加上鎖,保證其他事務(wù)不會再并發(fā)修改這條記錄。

四、InnoDB一級索引、二級索引

每個InnoDB表具有一個特殊的索引稱為聚簇索引(也叫聚集索引,聚類索引,簇集索引)。如果表上定義有主鍵,該主鍵索引就是聚簇索引。如果未定義主鍵,MySQL取第一個唯一索引(unique)而且只含非空列(NOT NULL)作為主鍵,InnoDB使用它作為聚簇索引。如果沒有這樣的列,InnoDB就自己產(chǎn)生一個這樣的ID值,它有六個字節(jié),而且是隱藏的,使其作為聚簇索引。

表中的聚簇索引(clustered index )就是一級索引,除此之外,表上的其他非聚簇索引都是二級索引,又叫輔助索引(secondary indexes)

五、Mysql鎖

5.1、鎖的分類:

1、共享鎖(S鎖、讀鎖):允許并發(fā)的讀取同一資源, 但會阻塞其他寫鎖的sql請求;

2、排他鎖(X鎖、寫鎖):一個寫鎖會阻塞其他的寫鎖或讀鎖,保證同一時刻只有一個連接可以寫入數(shù)據(jù)。

recordLock(行鎖):直接加在索引記錄上面,鎖住的是key,而非記錄本身(Oracle是通過在數(shù)據(jù)塊中對相應(yīng)數(shù)據(jù)行加鎖來實現(xiàn)的)。如果該表上沒有任何索引,那么Innodb會在后臺創(chuàng)建一個隱藏的聚簇索引,鎖住的就是這個隱藏的聚簇索引。即當一條sql沒有走任何索引時,那么將會在每一條聚簇索引后面加X鎖,這個類似于表鎖,但原理上和表鎖應(yīng)該是不同的。為了效率考量,MySQL做了優(yōu)化,對于不滿足條件的記錄,會在判斷后放鎖,最終持有的,是滿足條件的記錄上的鎖,但是不滿足條件的記錄上的加鎖/放鎖動作不會省略。

gapLock(間隙鎖):鎖定索引記錄間隙,確保索引記錄的間隙不變。間隙鎖是針對事務(wù)隔離級別為可重復(fù)讀或以上的。

next key lock:recordLock+gapLock

5.2、鎖的策略

1、row lock(行鎖):表中某些行被某個連接占用了寫鎖,但是其他行依然可以被其他連接請求讀鎖、寫鎖。

2、table lock(表鎖):整個表被某一個連接占用了寫鎖,導(dǎo)致其他連接的讀鎖或者寫鎖都會阻塞;影響整個表的讀寫。通常發(fā)生在DDL語句\DML不走索引的語句中。

六、Sql分析

select * from table where xxx; (MVCC快照讀,一般不加鎖)

select * from table where xxx lock in share mode;? (讀鎖,當前讀,顯示鎖,會阻塞其他的寫鎖請求,但其他的讀鎖請求沒有影響)

select * from table where xxx for update;? (寫鎖,當前讀,顯示鎖,會阻塞其他的讀寫請求,)

update tableName set xxx (寫鎖,當前讀,隱式鎖)

insert (寫鎖,當前讀,隱式鎖

delete (寫鎖,當前讀,隱式鎖

說明:為什么將插入/更新/刪除操作,都歸為當前讀?可以看看下面這個更新操作,在數(shù)據(jù)庫中的執(zhí)行流程:

一個Update操作的具體流程:當Update SQL被發(fā)給MySQL后,MySQL Server會根據(jù)where條件,讀取第一條滿足條件的記錄,然后InnoDB引擎會將第一條記錄返回,并加鎖 (current read)。待MySQL Server收到這條加鎖的記錄之后,會再發(fā)起一個Update請求,更新這條記錄。一條記錄操作完成,再讀取下一條記錄,直至沒有滿足條件的記錄為止。因此,Update操作內(nèi)部,就包含了一個當前讀。同理,Delete操作也一樣。Insert操作會稍微有些不同,簡單來說,就是Insert操作可能會觸發(fā)Unique Key的沖突檢查,也會進行一個當前讀。

注:根據(jù)上圖的交互,針對一條當前讀的SQL語句,InnoDB與MySQL Server的交互,是一條一條進行的,因此,加鎖也是一條一條進行的。先對一條滿足條件的記錄加鎖,返回給MySQL Server,做一些DML操作;然后在讀取下一條加鎖,直至讀取完畢。

七、Mysql事務(wù)

ANSI/ISO SQL標準定義了4中事務(wù)隔離級別:讀未提交(read uncommitted),讀提交(read committed),重復(fù)讀(repeatable read),串行讀(serializable)。不同的隔離級別有不同的現(xiàn)象:

1、臟讀(dirty read):一個事務(wù)可以讀取另一個尚未提交事務(wù)的修改數(shù)據(jù)。

2、不可重復(fù)讀(nonrepeatable read):在同一個事務(wù)中,同一個查詢在T1時間讀取某一行,在T2時間重新讀取這一行時候,這一行的數(shù)據(jù)已經(jīng)發(fā)生修改,可能被更新了(update),也可能被刪除了(delete)。

3、幻像讀(phantom read):在同一事務(wù)中,同一查詢多次進行時候,由于其他插入操作(insert)的事務(wù)提交,導(dǎo)致每次返回不同的結(jié)果集。

不同的隔離級別有不同的現(xiàn)象,并有不同的鎖定/并發(fā)機制,隔離級別越高,數(shù)據(jù)庫的并發(fā)性就越差。在Oracle中默認的事務(wù)隔離級別是提交讀(read committed)。對于MySQL的Innodb的默認事務(wù)隔離級別是重復(fù)讀(repeatable read),Mysql中的RR不會臟讀、可重復(fù)讀(Innodb使用多版本一致性讀來實現(xiàn)),并不能完全避免幻讀(這點和ANSI/ISO SQL標準定義的有所區(qū)別),需要加next key locks,可以使顯示鎖(select * for update or lock in share mode)。

?

Ref:

http://hedengcheng.com/?p=771

http://hedengcheng.com/?p=577

https://blog.csdn.net/lemon89/article/details/51477497

https://juejin.im/post/5ab5e44a6fb9a028c97a013d

轉(zhuǎn)載于:https://my.oschina.net/u/3787772/blog/1932688

總結(jié)

以上是生活随笔為你收集整理的mysql锁与事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品操| 久久精品无码毛片 | 色之久久综合 | 尤物精品视频在线观看 | 久久精品夜色噜噜亚洲a∨ 中文字幕av网 | 久久综合操 | 成人免费播放视频 | 欧美成人视 | 浮妇高潮喷白浆视频 | 四十路av | 国产成人主播 | 深田咏美在线x99av | 爱爱视频网 | 人妻视频一区二区三区 | 日韩图片一区 | 欧美日韩免费做爰视频 | 天堂亚洲网 | 欧美视频xxx | 99在线无码精品入口 | 欧美一区二区三区四区五区六区 | 黄色一级片免费 | 亚洲AV无码一区二区三区蜜桃 | 日本xxxxxxxxx69| 国产欧美一区二区三区视频在线观看 | 97精品国产97久久久久久春色 | 91精品国产91综合久久蜜臀 | 最新av免费观看 | 铠甲勇士猎铠 | 爱情岛亚洲品质自拍极速福利网站 | 日韩精品免费一区二区三区竹菊 | 国产成人综合自拍 | japanese21ⅹxx日本 | av免费观看入口 | 欧美日韩aa | 国产最新精品视频 | 日韩熟女精品一区二区三区 | 日韩精品视频一区二区 | 午夜精品久久久久久久无码 | 国产精品嫩草久久久久 | 最新国产在线视频 | 麻豆影音先锋 | 色多多视频在线 | xnxx国产 | 成年人小视频 | 日韩欧美在线播放 | 91丨porny丨露出 | 久草香蕉在线 | 诱人的乳峰奶水hd | 日韩精品区 | 黄色网址在线免费播放 | 少妇一级淫片免费放2 | 亚洲天堂精品一区 | 在线视频国产一区 | 少妇太爽了在线观看 | 欧美日韩一区不卡 | 国产人妻一区二区三区四区五区六 | 国产九九在线 | 成人动漫在线观看免费 | 精品一区二区三区免费 | 亚洲午夜精品福利 | 久草观看视频 | 高清一区二区三区四区五区 | 国产激情自拍视频 | 青青91| 日韩av在线看免费观看 | 国产免费视频一区二区三区 | 朝桐光av在线 | 久久丫精品国产亚洲av不卡 | 国产精品羞羞答答在线 | 日本欧美一级 | 黄色av网页 | 日韩精品视频免费 | 女的高潮流时喷水图片大全 | 久久99精品久久久久 | 91网站在线免费观看 | 欧美一级特黄aaaaaa大片在线观看 | 久久橹| 色悠悠国产 | 自拍偷拍第5页 | 国产精品无码免费在线观看 | 亚洲天堂资源在线 | 国产精品黄视频 | 中文字幕资源网 | 久久国产精品久久久久 | 亚洲激情黄色 | 伊人成综合网 | 亚洲一区二区偷拍 | 国产高清不卡一区 | 性xxxfllreexxx少妇| 国产熟妇久久777777 | 日韩在线资源 | 久久国内视频 | a级在线观看网站 | 绿帽在线| 未满十八18禁止免费无码网站 | 男生插女生网站 | 草久久av | 人人干在线视频 | 天天撸一撸 |