成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

跑了四個(gè)實(shí)驗(yàn),實(shí)戰(zhàn)講解 MySQL的行鎖、間隙鎖...

數(shù)據(jù)庫 MySQL
今天跟大家聊一聊MySQL的事務(wù)隔離,并通過一些實(shí)驗(yàn)做了些總結(jié)。光說不練,假把式,沒有經(jīng)過實(shí)踐就沒有話語權(quán)。

[[440226]]

大家好,我是Tom哥~

今天跟大家聊一聊MySQL的事務(wù)隔離,并通過一些實(shí)驗(yàn)做了些總結(jié)。光說不練,假把式,沒有經(jīng)過實(shí)踐就沒有話語權(quán)。

我們都知道數(shù)據(jù)庫有四種隔離級(jí)別,分別是:

  • 讀未提交(READ UNCOMMITTED)
  • 讀已提交 (READ COMMITTED)
  • 可重復(fù)讀 (REPEATABLE READ)
  • 串行化 (SERIALIZABLE)

實(shí)驗(yàn)前的準(zhǔn)備工作

1、基礎(chǔ)環(huán)境

當(dāng)前的數(shù)據(jù)庫版本

  1. mysql> select version(); 
  2. +-----------+ 
  3. | version() | 
  4. +-----------+ 
  5. | 8.0.27    | 
  6. +-----------+ 
  7. 1 row in set (0.00 sec) 

當(dāng)前的事務(wù)隔離級(jí)別

  1. mysql> show variables like 'transaction_isolation'
  2. +-----------------------+-----------------+ 
  3. | Variable_name         | Value           | 
  4. +-----------------------+-----------------+ 
  5. | transaction_isolation | REPEATABLE-READ | 
  6. +-----------------------+-----------------+ 
  7. 1 row in set (0.00 sec) 

2、創(chuàng)建個(gè)人收支表,并對(duì) income 字段創(chuàng)建索引,expend字段沒有索引

  1. CREATE TABLE `person` ( 
  2.   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵'
  3.   `income` bigint(20) NOT NULL COMMENT '收入'
  4.   `expend` bigint(20) NOT NULL COMMENT '支出'
  5.   PRIMARY KEY (`id`), 
  6.   KEY `idx_income` (`income`) 
  7. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='個(gè)人收支表'

3、初始化表數(shù)據(jù),插入5條記錄

  1. insert into person values(100,1000,1000); 
  2. insert into person values(200,2000,2000); 
  3. insert into person values(300,3000,3000); 
  4. insert into person values(400,4000,4000); 
  5. insert into person values(500,5000,5000); 

實(shí)驗(yàn)一:(事務(wù)A、B的條件字段沒有索引)

實(shí)驗(yàn)過程:

為了便于描述,我們定義時(shí)間軸坐標(biāo),用T1、T2、T3... 表示當(dāng)前時(shí)刻。

T1:

事務(wù)A開啟事務(wù),并執(zhí)行 select * from person where expend=4000 for update;

由于 expend 字段沒有索引,需要掃描全表。此時(shí)加的鎖是所有記錄的行鎖和它們之間的間隙鎖,也稱為 next-key lock,前開后閉區(qū)間。分別是 (-∞,100]、(100,200]、(200,300]、(300,400]、(400,500]、(500, +supremum]

T2:

事務(wù)B開啟事務(wù),執(zhí)行插入語句 insert into person values(401,4001,4001); 此時(shí)一直被阻塞住,因?yàn)椴]有獲得鎖。

面的這種情況,有兩種選擇:一種等到事務(wù)A結(jié)束(提交或回滾);另一種等事務(wù)鎖超時(shí)。

接著這個(gè)話題,我們稍微擴(kuò)展介紹下鎖超時(shí):

MySQL數(shù)據(jù)庫采用InnoDB模式,默認(rèn)參數(shù):innodb_lock_wait_timeout設(shè)置鎖等待的時(shí)間是50s,一旦數(shù)據(jù)庫鎖超過這個(gè)時(shí)間就會(huì)報(bào)錯(cuò)。

  1. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 

當(dāng)然,我們也可以通過命令來查看、修改這個(gè)超時(shí)時(shí)間

  1. # 查看超時(shí)時(shí)間 
  2. SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout'
  3.  
  4. # 修改時(shí)間 
  5. SET GLOBAL innodb_lock_wait_timeout=120; 

T3:

事務(wù)A ,執(zhí)行 commit 操作, 提交事務(wù)

T4:

事務(wù)B,插入一條記錄,insert into person values(401,4001,4001); 操作成功。

此時(shí) select * from person; 可以看到新插入的記錄

實(shí)驗(yàn)二:(事務(wù)A、B的條件字段有創(chuàng)建索引)

T1:

事務(wù)A,開啟事務(wù),并執(zhí)行 select * from person where income=3000 for update,命中記錄且 income 有索引,此時(shí)的加鎖區(qū)間是 income=3000 的行記錄以及與下一個(gè)值4000之間的空隙(行鎖+間隙鎖),也就是[3000,4000]

T2:

事務(wù)B,開始事務(wù),執(zhí)行 insert into person values(301,3001,3001); 沒有搶到鎖,線程被阻塞住,直到事務(wù)A提交事務(wù)并釋放鎖。

實(shí)驗(yàn)三:(自動(dòng)識(shí)別死鎖)

特別說明:

T3:事務(wù)A執(zhí)行insert操作,被事務(wù)B的鎖攔截住了

T4:同理,事務(wù)B執(zhí)行insert操作,被事務(wù)A攔截了,這里被系統(tǒng)自動(dòng)檢測(cè)到,拋出 ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction 。將事務(wù)B持有的鎖釋放掉,并重啟事務(wù)。

T5:事務(wù)A在T3時(shí)刻的insert可以繼續(xù)操作

實(shí)驗(yàn)四:(更新記錄鎖保護(hù))

1、事務(wù)A在執(zhí)行后 update person set income=111 where income=3000; 開啟了鎖保護(hù)

2、這時(shí),事務(wù)B再執(zhí)行 insert into person values(307,3000,3000) 或者 update person set income=3000 where id=100,都會(huì)重新去搶奪鎖,從而保證安全。

知識(shí)小結(jié)

1、對(duì)于事務(wù),binlog 日志是在 commit 提交時(shí)才生成的

2、行鎖與間隙鎖有很大區(qū)別。

行鎖:如果事務(wù)A對(duì) id=1 添加行鎖,事務(wù)B則無法對(duì) id=1 添加行鎖

間隙鎖:如果 select .. from 表名 where d=6 for updata,事務(wù)A 和 事務(wù) B 都可以對(duì)(5,12)添加間隙鎖。間隙鎖是開區(qū)間。

3、行鎖和間隙鎖合稱 next-key lock,每個(gè) next-key lock 是前開后閉區(qū)間。

4、只有在可重復(fù)讀的隔離級(jí)別下,才會(huì)有間隙鎖

5、讀提交級(jí)別沒有間隙鎖,只有行鎖,但是如何保證一個(gè)間隙操作產(chǎn)生的 binlog 對(duì)主從數(shù)據(jù)同步產(chǎn)生的影響呢?我們需要把 binlog 的格式設(shè)置為 row。

其本質(zhì)就是將模糊操作改成了針對(duì)具體的主鍵id行操作

  1. # 初始語句 
  2. delete from order where c = 10 
  3.  
  4. # 轉(zhuǎn)換后語句 
  5. delete from order where id = 10 

6、大部分公司的數(shù)據(jù)庫的隔離級(jí)別都是讀提交隔離級(jí)別加 binlog_format=row 的組合

7、 大多數(shù)數(shù)據(jù)庫的默認(rèn)級(jí)別就是讀提交(Read committed),比如Sql Server 、 Oracle。MySQL的默認(rèn)級(jí)別是 可重復(fù)讀(Repeatable Read )

本文轉(zhuǎn)載自微信公眾號(hào)「微觀技術(shù)」

 

責(zé)任編輯:姜華 來源: 微觀技術(shù)
相關(guān)推薦

2025-06-04 02:55:00

MySQL意向鎖記錄鎖

2023-11-06 08:35:08

表鎖行鎖間隙鎖

2020-10-20 13:50:47

MySQL數(shù)據(jù)庫

2023-12-06 07:33:20

MySQL鎖事間隙鎖

2022-10-24 08:02:14

MySQL索引類型

2024-11-29 07:38:12

MySQL數(shù)據(jù)庫

2013-12-19 13:25:40

InnoDB數(shù)據(jù)庫

2024-01-16 12:19:08

MySQL重要機(jī)制高并發(fā)

2018-07-31 10:10:06

MySQLInnoDB死鎖

2022-04-29 11:39:28

MySQL幻讀Gap Lock

2020-07-02 08:22:56

MySQL間隙鎖過行鎖

2024-05-13 12:44:00

InnodbMySQL行級(jí)鎖

2010-05-24 12:50:59

MySQL表級(jí)鎖

2025-02-10 09:58:48

2019-11-15 08:46:16

MySQLMVCC表讀鎖

2024-03-04 00:01:00

鎖表鎖行MySQL

2022-10-24 00:33:59

MySQL全局鎖行級(jí)鎖

2020-02-06 10:02:45

MySQL數(shù)據(jù)庫全局鎖

2021-10-26 00:07:35

TCP連接python

2010-11-22 14:42:13

MySQL行級(jí)鎖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: av日韩一区 | 日韩免费福利视频 | 久久国产高清 | 日韩在线一区二区三区 | 免费黄色a级毛片 | 97人人澡人人爽91综合色 | 午夜伦理影院 | 国产精品夜色一区二区三区 | 一区二区三区四区在线 | 高清国产一区二区 | 欧美精品久久久久 | 成人h电影在线观看 | jizz中国日本 | 精品久久久久久中文字幕 | 欧美日韩在线高清 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 亚洲国产精品一区二区久久 | 在线播放一区二区三区 | 日韩在线视频免费观看 | 亚洲精品国产一区 | 91精品国产91久久综合桃花 | 久久草在线视频 | 亚洲情侣视频 | 91精品国产91久久久久久最新 | 日韩精品一区二区三区在线观看 | 亚洲国产精品一区二区www | 在线观看日韩精品视频 | 国产精品成人一区二区三区吃奶 | 日韩在线欧美 | 欧美在线天堂 | 亚洲国产日本 | 国产乱人伦 | 色久在线 | 久久夜色精品国产 | 蜜臀久久99精品久久久久久宅男 | 欧美成年人视频在线观看 | 欧美日韩一区二区三区不卡视频 | 久久一区二 | 这里精品| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美一区二区三区在线观看视频 |