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

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

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

Purge死鎖

場景說明

Purge死鎖說明

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

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

回顧插入過程 完整的插入過程如下:

假設(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的原因)

不直接報錯退出或者提示已存在的原因,是因為有可能之前的 記錄25 標(biāo)記為刪除( delete-mark ),然后等待 purge

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

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

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

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

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

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

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

演示

因為要模擬插入記錄 20* 的時候,老的 記錄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
--
-- 終端會話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這個變量,結(jié)果還是off,這個不用管,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)
-- 終端會話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)
-- 終端會話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表示是第二個插入的記錄20
-- 且info bits為32,表示記錄被標(biāo)記刪除了
0: len 4; hex 80000014; asc ;; -- 記錄為20
1: len 4; hex 80000002; asc ;; -- 對應(yīng)的主鍵為2
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
-- heap no=4表示的是20的下一個記錄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. 因為是唯一索引,需要做唯一性檢查,從老的記錄 20* 開始檢查(第一個小于等于自己的值),則此時 20* 上要加上一把 S lock ,然后往下檢查到第一個不相等的記錄,即 記錄30 ,然后退出,但是這個 記錄30 也要 加上S lock

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

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

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

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

mysql> insert into test_purge(b) values(25);
ERROR 1205 (HY000): Unknown error 1205 -- 等待了一段時間后,超時
---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 ;;

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

總結(jié)

以上所述是小編給大家介紹的MySQL數(shù)據(jù)庫之Purge死鎖問題解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(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知識,一起看看吧
    2021-06-06
  • 淺談Java中的n種隨機(jī)數(shù)產(chǎn)生辦法

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

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

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

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

    Java?SpringBoot整合shiro-spring-boot-starterqi項目報錯解決

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

    IntelliJ IDEA使用SVN分支的簡單介紹

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

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

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

    Java中printStackTrace()用法示例

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

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

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

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

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

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

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

最新評論

师宗县| 宁晋县| 双峰县| 临安市| 乐东| 洞头县| 横峰县| 柏乡县| 大庆市| 克山县| 巴东县| 温宿县| 凤凰县| 芜湖市| 嘉峪关市| 惠安县| 昂仁县| 鹤山市| 南澳县| 凤翔县| 安图县| 石棉县| 军事| 谷城县| 门头沟区| 萍乡市| 封开县| 乌兰浩特市| 九江市| 荥阳市| 咸阳市| 安塞县| 新和县| 锦屏县| 台北县| 虞城县| 钟山县| 林西县| 鹤峰县| 常熟市| 合水县|