最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于for update和lock in share mode的區(qū)別及說明

 更新時間:2023年08月29日 14:57:47   作者:小淼同學(xué)  
這篇文章主要介紹了關(guān)于for update和lock in share mode的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

lock in share mode 就是共享鎖

如果事務(wù)對某行數(shù)據(jù)加上共享鎖之后,可進行讀寫操作;其他事務(wù)可以對該數(shù)據(jù)加共享鎖,但不能加排他鎖,且只能讀數(shù)據(jù),不能修改數(shù)據(jù)。

某個事物想進行修改數(shù)據(jù)操作,那他必須等其他事物的共享鎖都釋放完畢才能進行修改操作

for update 排他鎖,就是行鎖

如果事務(wù)對數(shù)據(jù)加上排他鎖之后,則其他事務(wù)不能對該數(shù)據(jù)加任何的鎖。

獲取排他鎖的事務(wù)既能讀取數(shù)據(jù),也能修改數(shù)據(jù)。

注:普通 select 語句默認(rèn)不加鎖,而CUD操作默認(rèn)加排他鎖。

例子

下面例子的前提都是針對同一行數(shù)據(jù)。

1.同一行數(shù)據(jù)為前提,兩個事物都進行共享鎖查詢

2.同一行數(shù)據(jù)為前提,一個事物進行共享鎖查詢,另一個事物進行修改

第一個占有著共享鎖,第二個事物沒法更新,必須等第一個事物釋放才能進行更新

3.同一行數(shù)據(jù)為前提,一個進行共享鎖查詢,另一個先進行共享鎖查詢,然后update

同第二種,修改的事物就一直在轉(zhuǎn)圈圈,等待事物1提交。事物1不提交,那事物2只能等到超時返回錯誤。

4.同一行數(shù)據(jù)為前提,當(dāng)事物一獲得共享鎖,另一個事物是否可以獲得排它鎖

答案是不能,事物二就一直轉(zhuǎn)圈圈,等待1的釋放

結(jié)論:同一行數(shù)據(jù)為前提,當(dāng)一個事物獲得共享鎖,另一個事物可以獲得共享鎖進行讀操作,但不能進行修改操作,想要修改必須等其他的共享鎖釋放完畢。還有一個事物獲得了共享鎖,另一個事物不能獲得排它鎖

5.同一行數(shù)據(jù)為前提,一個事物獲取到排他鎖,另一個事物進行查詢

結(jié)果是可以的,一個獲取排它鎖,另一個進行普通查詢

6.同一行數(shù)據(jù)為前提,一個事物獲取到排他鎖,另一個事物進行共享鎖的獲取

結(jié)果如圖2,愛的魔力轉(zhuǎn)圈圈,就一直卡在那里

7.同一行數(shù)據(jù)為前提,一個事物獲取排它鎖,另一個事物是否可以進行修改

結(jié)果如圖2,愛的魔力轉(zhuǎn)圈圈,就一直卡在那里

8.同一行數(shù)據(jù)為前提,一個事物獲取排它鎖,另一個是否可以獲取排它鎖

結(jié)果如圖2,愛的魔力轉(zhuǎn)圈圈,就一直卡在那里

結(jié)論:當(dāng)前事務(wù)獲取某行數(shù)據(jù)排他鎖后,其他事務(wù)是否可以對該行數(shù)據(jù)進行讀寫操作和獲取共享鎖:其他事務(wù)可以讀,不可以獲取共享鎖,不可以寫

這里再給讀者科普一點,行鎖和索引的關(guān)系:查詢字段未加索引(主鍵索引、普通索引等)時,使用表鎖

注:InnoDB行級鎖基于索引實現(xiàn)。

未加索引時,兩種行鎖情況為(使用表鎖):

  • 事務(wù)1獲取某行數(shù)據(jù)共享鎖,其他事務(wù)可以獲取不同行數(shù)據(jù)的共享鎖,不可以獲取不同行數(shù)據(jù)的排他鎖
  • 事務(wù)1獲取某行數(shù)據(jù)排他鎖,其他事務(wù)不可以獲取不同行數(shù)據(jù)的共享鎖、排他鎖

加索引后,兩種行鎖為(使用行鎖):

  • 事務(wù)1獲取某行數(shù)據(jù)共享鎖,其他事務(wù)可以獲取不同行數(shù)據(jù)的排他鎖
  • 事務(wù)1獲取某行數(shù)據(jù)排他鎖,其他事務(wù)可以獲取不同行數(shù)據(jù)的共享鎖、排他鎖

表結(jié)果:

CREATE TABLE `pf_banner` (
  `id` bigint(22) NOT NULL AUTO_INCREMENT,
  `num` int(11) DEFAULT NULL,
  `title` varchar(80) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `img` varchar(255) DEFAULT NULL,
  `status` tinyint(4) DEFAULT '1' COMMENT '狀態(tài) 1:顯示 -1不顯示',
  `create_time` datetime DEFAULT NULL,
  `modify_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='banner位圖片'

例子

1.未加索引,事務(wù)1獲取某行數(shù)據(jù)共享鎖,事務(wù)2更新不同行數(shù)據(jù)阻塞:

2.未加索引,事務(wù)1獲取某行數(shù)據(jù)共享鎖,事務(wù)2獲取不同行數(shù)據(jù)共享鎖成功:

3.未加索引,事務(wù)1獲取某行數(shù)據(jù)排他鎖,事務(wù)2獲取不同行數(shù)據(jù)共享鎖阻塞:

4.未加索引,事務(wù)1獲取某行數(shù)據(jù)排他鎖,事務(wù)2獲取不同行數(shù)據(jù)排他鎖阻塞:

加索引后表結(jié)構(gòu):

CREATE TABLE `pf_banner` (
  `id` bigint(22) NOT NULL AUTO_INCREMENT,
  `num` int(11) DEFAULT NULL,
  `title` varchar(80) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `img` varchar(255) DEFAULT NULL,
  `status` tinyint(4) DEFAULT '1' COMMENT '狀態(tài) 1:顯示 -1不顯示',
  `create_time` datetime DEFAULT NULL,
  `modify_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_num` (`num`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='banner位圖片'

1.加索引后,事務(wù)1獲取某行數(shù)據(jù)共享鎖,事務(wù)2可以更新不同行數(shù)據(jù):

2.加索引后,事務(wù)1獲取某行數(shù)據(jù)共享鎖,事務(wù)2獲取不同行數(shù)據(jù)共享鎖成功:

3.加索引后,事務(wù)1獲取某行數(shù)據(jù)排他鎖,事務(wù)2獲取不同行數(shù)據(jù)排他鎖成功:

4.加索引后,事務(wù)1獲取某行數(shù)據(jù)排他鎖,事務(wù)2獲取不同行數(shù)據(jù)共享鎖成功:

科普小知識2:索引數(shù)據(jù)重復(fù)率太高會導(dǎo)致全表掃描:當(dāng)表中索引字段數(shù)據(jù)重復(fù)率太高,則MySQL可能會忽略索引,進行全表掃描,此時使用表鎖??墒褂?force index 強制使用索引。

操作步驟

1.事務(wù)1,執(zhí)行鼠標(biāo)選中的內(nèi)容

2.事物2,執(zhí)行鼠標(biāo)選中的內(nèi)容

你會發(fā)現(xiàn)事物2會一直轉(zhuǎn)圈圈,其實在執(zhí)行update的時候,已經(jīng)是表鎖了。導(dǎo)致事物2 進行行鎖的時候,需要等待事物1的釋放

現(xiàn)在,我們使用強制鎖進行更新操作。

當(dāng)你使用強制索引的時候,就會發(fā)現(xiàn)更新成功了。

當(dāng)然數(shù)據(jù)重復(fù)降低,也是能成功的

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

上蔡县| 普宁市| 克什克腾旗| 茌平县| 永德县| 那曲县| 卫辉市| 万年县| 应城市| 建阳市| 苗栗市| 永仁县| 紫阳县| 桑日县| 喜德县| 安阳县| 台东县| 信宜市| 外汇| 新宁县| 乌拉特前旗| 奉化市| 石河子市| 英超| 贡嘎县| 孝义市| 大新县| 灵寿县| 营口市| 仙游县| 长沙县| 卢龙县| 潢川县| 安丘市| 普宁市| 措美县| 沙湾县| 伽师县| 广河县| 邵武市| 明水县|