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

MySQL數(shù)據(jù)庫(kù)之Purge死鎖問題解析

 更新時(shí)間:2017年11月06日 10:38:10   投稿:mrr  
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)之Purge死鎖問題解析的相關(guān)資料,需要的朋友可以參考下

Purge死鎖

場(chǎng)景說(shuō)明

Purge死鎖說(shuō)明

表中存在記錄(unique key) 10,20,30,40 (且有 自增主鍵 ),現(xiàn)在刪除記錄 20 ,并且已經(jīng) 提交 了該事物。 purge 線程此時(shí)還 沒有回收 該記錄,且此時(shí)又 插入 新的記錄 20 。

+------+------+------+------+
orignal | 10 | 20 | 30 | 40 |
unique +------+------+------+------+
delete 20 +------+------+------+------+
| 10 | 20* | 30 | 40 | (20 : delete-mark)
and commit +------+^----^+------+------+
| |
non happen | +--insert new 20
|
Purge
# 自增主鍵圖中沒有給出

回顧插入過(guò)程 完整的插入過(guò)程如下:

假設(shè)現(xiàn)在有記錄 10,30,50,70 ;且為 unique key ,需要插入記錄 25 。

1. 找到 小于等于25的記錄 ,這里是 10

如果記錄中已經(jīng) 存在記錄25 ,且?guī)в?唯一性約束 ,則需要在 記錄25 上增加 S Gap-lock (purge的案例中,老 記錄20* 要加S lock的原因)

不直接報(bào)錯(cuò)退出或者提示已存在的原因,是因?yàn)橛锌赡苤暗?記錄25 標(biāo)記為刪除( delete-mark ),然后等待 purge

如果 假設(shè) 這里 沒有S Gap-Lock ,此時(shí) 記錄30 上也 沒有鎖 的,按照下面的步驟,可以插入 兩個(gè)25 ,這樣就 破壞了唯一性約束

2. 找到 記錄10的下一條記錄 ,這里是 30

3. 判斷 下一條記錄30 上是否有鎖(如果有=25的情況,后面再討論)

判斷 30 上面如果 沒有鎖 ,則 可以插入

判斷 30 上面如果有 Record Lock ,則 可以插入

判斷 30 上面如果有 Gap Lock / Next-Key Lock ,則無(wú)法插入,因?yàn)殒i的范圍是 (10, 30) / (10, 30] ;在 30 上增加 insert intention lock (此時(shí)處于 waiting 狀態(tài)),當(dāng) Gap Lock / Next-Key Lock 釋放時(shí),等待的事物(transaction)將被 喚醒 ,此時(shí) 記錄30 上才能獲得 insert intention lock ,然后再插入 記錄25

在這個(gè)場(chǎng)景中,新插入的記錄 20 ,和已經(jīng)存在的記錄 20* 相等,且?guī)в形ㄒ患s束,那此時(shí)就需要在記錄 20* 上增加 S lock(with gap)

演示

因?yàn)橐M插入記錄 20* 的時(shí)候,老的 記錄20 要存在,所以使用debug版本,將 purge線程停掉 。

[root@MyServer ~]> mysqld-debug --version
mysqld-debug Ver 5.7.11-debug for linux-glibc2.5 on x86_64 (MySQL Community Server - Debug (GPL))
[root@MyServer ~]> mysqld-debug --datadir=/data/mysql_data/5.7.11/ &
[1] 1493
[root@MyServer ~]> netstat -tunlp | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1493/mysqld-debug
--
-- 終端會(huì)話1
mysql> create table test_purge(a int auto_increment primary key, b int , unique key(b));
Query OK, 0 rows affected (0.20 sec)
mysql> insert into test_purge(b) values (10),(20),(30),(40);
Query OK, 4 rows affected (0.05 sec)
mysql> commit; -- autocommit=0 in my.cnf
Query OK, 0 rows affected (0.03 sec)
mysql> set global innodb_purge_stop_now=1;
-- show這個(gè)變量,結(jié)果還是off,這個(gè)不用管,purge線程已經(jīng)停止了
Query OK, 0 rows affected (0.00 sec)
mysql> begin;
mysql> delete from test_purge where b=20;
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.02 sec)
-- 終端會(huì)話2
mysql> select * from test_purge;
+---+------+
| a | b | -- 20的那條記錄已經(jīng)刪除,但是還沒有被purge(purge線程停止)
| 1 | 10 |
| 3 | 30 |
| 4 | 40 |
3 rows in set (0.00 sec)
mysql> insert into test_purge(b) values(20);
Query OK, 1 row affected (0.04 sec)
-- 終端會(huì)話3
mysql> show engine innodb status\G
-- ----------------省略其他輸出----------------
---TRANSACTION 9497, ACTIVE 19 sec
3 lock struct(s), heap size 1160, 3 row lock(s), undo log entries 1
MySQL thread id 3, OS thread handle 139922002294528, query id 26 localhost root cleaning up
TABLE LOCK table `burn_test`.`test_purge` trx id 9497 lock mode IX
RECORD LOCKS space id 47 page no 4 n bits 72 index b of table `burn_test`.`test_purge` trx id 9497 lock mode S -- S lock (with gap)
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
-- heap no=3表示是第二個(gè)插入的記錄20
-- 且info bits為32,表示記錄被標(biāo)記刪除了
0: len 4; hex 80000014; asc ;; -- 記錄為20
1: len 4; hex 80000002; asc ;; -- 對(duì)應(yīng)的主鍵為2
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
-- heap no=4表示的是20的下一個(gè)記錄30
-- 且該記錄上也有S lock
0: len 4; hex 8000001e; asc ;;
1: len 4; hex 80000003; asc ;;
RECORD LOCKS space id 47 page no 4 n bits 72 index b of table `burn_test`.`test_purge` trx id 9497 lock mode S locks gap before rec
Record lock, heap no 6 PHYSICAL RECORD: n_fields 2; compact format; info bits 0 -- heap no=6為新插入的記錄20,從隱式鎖提升為顯示鎖
0: len 4; hex 80000014; asc ;;
1: len 4; hex 80000005; asc ;;

1. 因?yàn)槭俏ㄒ凰饕枰鑫ㄒ恍詸z查,從老的記錄 20* 開始檢查(第一個(gè)小于等于自己的值),則此時(shí) 20* 上要加上一把 S lock ,然后往下檢查到第一個(gè)不相等的記錄,即 記錄30 ,然后退出,但是這個(gè) 記錄30 也要 加上S lock

2. 在插入 新的記錄20 的時(shí)候,發(fā)現(xiàn)下一條記錄30上有鎖,則自己插入的時(shí)的 隱式鎖 提升為 顯示鎖 (見插入步驟)

3. 目前鎖住的范圍是 (10,20], (20,30]

4. 新插入的記錄20本身是一把 S-Gap Lock (前面20*的有S lock了,由于是唯一索引,本身其實(shí)就不需要有記錄鎖了,有GAP就夠了)

所以記錄25無(wú)法插入(鎖等待)

mysql> insert into test_purge(b) values(25);
ERROR 1205 (HY000): Unknown error 1205 -- 等待了一段時(shí)間后,超時(shí)
---TRANSACTION 9508, ACTIVE 3 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1160, 1 row lock(s), undo log entries 1
MySQL thread id 5, OS thread handle 139922002560768, query id 46 localhost root update
insert into test_purge(b) values(25) -- 插入的25在等待
------- TRX HAS BEEN WAITING 3 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 47 page no 4 n bits 72 index b of table `burn_test`.`test_purge` trx id 9508 lock_mode X locks gap before rec insert intention waiting
------------------
TABLE LOCK table `burn_test`.`test_purge` trx id 9508 lock mode IX
---TRANSACTION 9503, ACTIVE 10 sec
MySQL thread id 7, OS thread handle 139922002028288, query id 44 localhost root cleaning up
TABLE LOCK table `burn_test`.`test_purge` trx id 9503 lock mode IX
RECORD LOCKS space id 47 page no 4 n bits 72 index b of table `burn_test`.`test_purge` trx id 9503 lock mode S
1: len 4; hex 80000002; asc ;;
RECORD LOCKS space id 47 page no 4 n bits 72 index b of table `burn_test`.`test_purge` trx id 9503 lock mode S locks gap before rec
Record lock, heap no 6 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
1: len 4; hex 80000007; asc ;;

這個(gè)例子中出現(xiàn)了 鎖等待 ,就要 警惕 了,如果有 兩個(gè)事物相互等待 ,就是 死鎖 了

總結(jié)

以上所述是小編給大家介紹的MySQL數(shù)據(jù)庫(kù)之Purge死鎖問題解析,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 解析ConcurrentHashMap: get、remove方法分析

    解析ConcurrentHashMap: get、remove方法分析

    ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見問題---ConcurrentHashMap知識(shí),一起看看吧
    2021-06-06
  • 淺談Java中的n種隨機(jī)數(shù)產(chǎn)生辦法

    淺談Java中的n種隨機(jī)數(shù)產(chǎn)生辦法

    眾所周知,隨機(jī)數(shù)是任何一種編程語(yǔ)言最基本的特征之一。而生成隨機(jī)數(shù)的基本方式也是相同的:產(chǎn)生一個(gè)0到1之間的隨機(jī)數(shù)??此坪?jiǎn)單,但有時(shí)我們也會(huì)忽略了一些有趣的功能。
    2015-09-09
  • Springboot 整合 Java DL4J 實(shí)現(xiàn)農(nóng)產(chǎn)品質(zhì)量檢測(cè)系統(tǒng)(推薦)

    Springboot 整合 Java DL4J 實(shí)現(xiàn)農(nóng)產(chǎn)品質(zhì)量檢測(cè)系統(tǒng)(推薦)

    本文詳細(xì)介紹了系統(tǒng)的搭建過(guò)程,包括技術(shù)選型、數(shù)據(jù)處理、模型訓(xùn)練和評(píng)估等關(guān)鍵步驟,系統(tǒng)采用卷積神經(jīng)網(wǎng)絡(luò),對(duì)水果成熟度和缺陷進(jìn)行識(shí)別,有效解決了傳統(tǒng)方法成本高、效率低的問題,有助于提升農(nóng)產(chǎn)品檢測(cè)的科技含量和自動(dòng)化水平
    2024-10-10
  • Java?SpringBoot整合shiro-spring-boot-starterqi項(xiàng)目報(bào)錯(cuò)解決

    Java?SpringBoot整合shiro-spring-boot-starterqi項(xiàng)目報(bào)錯(cuò)解決

    這篇文章主要介紹了Java?SpringBoot整合shiro-spring-boot-starterqi項(xiàng)目報(bào)錯(cuò)解決,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下
    2022-08-08
  • IntelliJ IDEA使用SVN分支的簡(jiǎn)單介紹

    IntelliJ IDEA使用SVN分支的簡(jiǎn)單介紹

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA使用SVN分支的簡(jiǎn)單介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • 分析JVM的執(zhí)行子系統(tǒng)

    分析JVM的執(zhí)行子系統(tǒng)

    本文主要介紹了JVM執(zhí)行子系統(tǒng)。了解虛擬機(jī)是如何執(zhí)行程序的, 虛擬機(jī)怎樣運(yùn)行一個(gè)Class文件的概念模型, 可以更好的理解怎樣寫出優(yōu)秀的代碼
    2021-06-06
  • Java中printStackTrace()用法示例

    Java中printStackTrace()用法示例

    這篇文章主要給大家介紹了關(guān)于Java中printStackTrace()用法的相關(guān)資料,printStackTrace()方法一般與拋出異常搭配使用,效果是打印出異常位置,需要的朋友可以參考下
    2024-05-05
  • JAVA設(shè)計(jì)模式之備忘錄模式原理與用法詳解

    JAVA設(shè)計(jì)模式之備忘錄模式原理與用法詳解

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之備忘錄模式,簡(jiǎn)單說(shuō)明了備忘錄模式的概念、原理并結(jié)合實(shí)例形式分析了java備忘錄模式的具體定義及使用方法,需要的朋友可以參考下
    2017-08-08
  • spring boot下mybatis配置雙數(shù)據(jù)源的實(shí)例

    spring boot下mybatis配置雙數(shù)據(jù)源的實(shí)例

    這篇文章主要介紹了spring boot下mybatis配置雙數(shù)據(jù)源的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Mybatis結(jié)果集映射一對(duì)多簡(jiǎn)單入門教程

    Mybatis結(jié)果集映射一對(duì)多簡(jiǎn)單入門教程

    本文給大家介紹Mybatis結(jié)果集映射一對(duì)多簡(jiǎn)單入門教程,包括搭建數(shù)據(jù)庫(kù)環(huán)境的過(guò)程,idea搭建maven項(xiàng)目的代碼詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06

最新評(píng)論

福州市| 玉林市| 阿城市| 武邑县| 托克托县| 吉水县| 万年县| 新昌县| 清涧县| 喀什市| 盈江县| 海兴县| 子洲县| 筠连县| 永新县| 满洲里市| 手游| 理塘县| 彩票| 玉溪市| 抚远县| 铜陵市| 甘洛县| 福清市| 永安市| 黄骅市| 台东县| 樟树市| 张北县| 拜泉县| 双牌县| 和田县| 翁源县| 来安县| 阳城县| 拉萨市| 宁晋县| 同心县| 大姚县| 垫江县| 梧州市|