[筆記]鎖:各種場景 整理
see:
http://dev.mysql.com/doc/refman/5.5/en/innodb-locks-set.html
原理:
當主鍵/唯一索引進行更新(INSERT/UPDATE/DELETE)時,如果無法獲取記錄的X鎖,會轉為等待獲取S鎖
但持有X鎖的執行緒釋放後,其他等待S鎖的執行緒都會持有S鎖
但再嘗試獲取X鎖 時,都無法獲取
=============場景
表結構
CREATE TABLE `tb` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_uniq_a` (`a`),
KEY `idx_b` (`b`)
) ENGINE=InnoDBDEFAULT CHARSET=utf8;
資料
insert into `tb`(`id`,`a`,`b`,`c`) values (1,1,0,1),(2,2,3,2),(3,3,1,3),(4,4,4,4),(5,5,4,5),(6,6,4,6),(7,7,5,7),(8,8,5,8),(9,9,5,9),(10,10,6,10),(11,11,6,11),(12,12,6,12),(13,13,6,13),(14,14,6,14),(15,15,7,15),(16,16,1,16);
# 主鍵: INSERT
th1: begin;INSERT INTO tb SET id=100,a=UNIX_TIMESTAMP();
th2: begin;INSERT INTO tb SET id=100,a=UNIX_TIMESTAMP();
th3: begin;INSERT INTO tb SET id=100,a=UNIX_TIMESTAMP();
th1先執行
th2、th3再執行,由於無法獲取X鎖,轉而獲取一個primary上id=100的S鎖
th1 rollback
th2、th3 由於持有S鎖,等待X鎖,發生死鎖
# 唯一索引: DELETE
th1: begin;delete from tb where a=3;
th2: begin;delete from tb where a=3;
th3: begin;delete from tb where a=3;
th1先執行
th2、th3再執行,由於無法獲取X鎖,轉而獲取一個idx_uniq_a上a=3的S鎖
th1 rollback
th2、th3 正常情況下th2先獲得X鎖,但不提交。th3由於無法獲取X鎖,在等待innodb_lock_wait_timeout秒後,報等待超時錯誤
但如果併發執行緒多可能會觸發死鎖 參見:
# 唯一索引: DELETE + INSERT
th1: begin;delete from tb where a=3;
th2: begin;delete from tb where a=3;
th3: begin;delete from tb where a=3;
th1先執行
th2、th3再執行,等待獲取X鎖,但由於是唯一索引,持有idx_uniq_a上a=3的S鎖
th1 : INSERT INTO tb SET a=3,b=3,c =CEIL(RAND()*10); 等待S鎖
th2、th3 由於持有S鎖,等待X鎖,發生死鎖
# 非唯一索引操作: DELETE
th1: begin;delete from tb where b=3;
th2: begin;delete from tb where b=3;
th3: begin;delete from tb where b=3;
th1先執行
th2、th3再依次執行,等待獲取X鎖,但由於不是唯一索引,不持有S鎖
th1 rollback 或者 INSERT INTO tb SET a=uinx_timestamp(),b=3,c =CEIL(RAND()*10); 不需要等待S鎖
th2先獲得X鎖,但不提交。th3由於無法獲取X鎖,在等待innodb_lock_wait_timeout秒後,報等待超時錯誤
http://dev.mysql.com/doc/refman/5.5/en/innodb-locks-set.html
原理:
當主鍵/唯一索引進行更新(INSERT/UPDATE/DELETE)時,如果無法獲取記錄的X鎖,會轉為等待獲取S鎖
但持有X鎖的執行緒釋放後,其他等待S鎖的執行緒都會持有S鎖
但再嘗試獲取X鎖 時,都無法獲取
=============場景
表結構
CREATE TABLE `tb` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_uniq_a` (`a`),
KEY `idx_b` (`b`)
) ENGINE=InnoDBDEFAULT CHARSET=utf8;
資料
insert into `tb`(`id`,`a`,`b`,`c`) values (1,1,0,1),(2,2,3,2),(3,3,1,3),(4,4,4,4),(5,5,4,5),(6,6,4,6),(7,7,5,7),(8,8,5,8),(9,9,5,9),(10,10,6,10),(11,11,6,11),(12,12,6,12),(13,13,6,13),(14,14,6,14),(15,15,7,15),(16,16,1,16);
# 主鍵: INSERT
th1: begin;INSERT INTO tb SET id=100,a=UNIX_TIMESTAMP();
th2: begin;INSERT INTO tb SET id=100,a=UNIX_TIMESTAMP();
th3: begin;INSERT INTO tb SET id=100,a=UNIX_TIMESTAMP();
th1先執行
th2、th3再執行,由於無法獲取X鎖,轉而獲取一個primary上id=100的S鎖
th1 rollback
th2、th3 由於持有S鎖,等待X鎖,發生死鎖
# 唯一索引: DELETE
th1: begin;delete from tb where a=3;
th2: begin;delete from tb where a=3;
th3: begin;delete from tb where a=3;
th1先執行
th2、th3再執行,由於無法獲取X鎖,轉而獲取一個idx_uniq_a上a=3的S鎖
th1 rollback
th2、th3 正常情況下th2先獲得X鎖,但不提交。th3由於無法獲取X鎖,在等待innodb_lock_wait_timeout秒後,報等待超時錯誤
但如果併發執行緒多可能會觸發死鎖 參見:
# 唯一索引: DELETE + INSERT
th1: begin;delete from tb where a=3;
th2: begin;delete from tb where a=3;
th3: begin;delete from tb where a=3;
th1先執行
th2、th3再執行,等待獲取X鎖,但由於是唯一索引,持有idx_uniq_a上a=3的S鎖
th1 : INSERT INTO tb SET a=3,b=3,c =CEIL(RAND()*10); 等待S鎖
th2、th3 由於持有S鎖,等待X鎖,發生死鎖
# 非唯一索引操作: DELETE
th1: begin;delete from tb where b=3;
th2: begin;delete from tb where b=3;
th3: begin;delete from tb where b=3;
th1先執行
th2、th3再依次執行,等待獲取X鎖,但由於不是唯一索引,不持有S鎖
th1 rollback 或者 INSERT INTO tb SET a=uinx_timestamp(),b=3,c =CEIL(RAND()*10); 不需要等待S鎖
th2先獲得X鎖,但不提交。th3由於無法獲取X鎖,在等待innodb_lock_wait_timeout秒後,報等待超時錯誤
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1220082/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE分散式事務鎖各種場景下的處理詳解Oracle分散式
- 一文弄懂分散式場景中各種鎖的原理及使用分散式
- Mysql各種鎖機制MySql
- C++中的各種鎖C++
- Java 各種鎖的小結Java
- 關於各種List型別特點以及使用的場景型別
- 5個非常良心好用的軟體工具,適合各種場景
- 各種分散式事務的實現方式適用的場景分散式
- Photoshop 中各種快捷方式整理分享
- 「API分享」整理了各種各樣的免費API介面API
- ActiveMQ筆記整理MQ筆記
- xdebug 各場景下工作流程
- .NET中各種執行緒同步鎖執行緒
- 各種儲存效能瓶頸場景的分析與最佳化手段
- 打破Web・App壁壘,一鍵跳轉連結各種場景WebAPP
- 隨記筆記未整理筆記
- 膝上型電腦鍵盤鎖住了怎麼解鎖 聯想華為惠普戴爾各種筆記本鍵盤解鎖方法介紹筆記
- 【吐血整理】Git的各種撤銷姿勢Git
- 室內場景資料集整理
- MySQL死鎖系列-常見加鎖場景分析MySql
- 【Java 併發筆記】7 種阻塞佇列相關整理Java筆記佇列
- [每天進步一點點]mysql筆記整理(二):事務與鎖MySql筆記
- 8分鐘搞懂Java中的各種鎖Java
- MySQL 當中的各種鎖(中級篇)MySql
- 筆記資源整理筆記
- SpringBoot整理筆記06Spring Boot筆記
- SpringBoot整理筆記08Spring Boot筆記
- 開源架構治理平臺 ArchGuard,專治分散式場景下各種不服架構分散式
- docker Linux 各種操作記錄DockerLinux
- FFmpeg開發筆記(十八)FFmpeg相容各種音訊格式的播放筆記音訊
- JS 中 this 在各個場景下的指向JS
- 多執行緒筆記---鎖(Synchronized)的優化和種類執行緒筆記synchronized優化
- Flutter筆記整理[待拆分]Flutter筆記
- AutoreleasePool、Block、Runloop整理筆記BloCOOP筆記
- 演算法筆記整理演算法筆記
- 分門別類總結Java中的各種鎖,讓你徹底記住Java
- 在.Net Core當中的WebApi 的模型繫結各種示例用法 以及使用場景WebAPI模型
- 各種機器學習演算法的應用場景分別是什麼?機器學習演算法
- 【人工智慧】各種機器學習的應用場景分別是什麼?人工智慧機器學習