乙個死鎖問題

2021-09-19 03:27:30 字數 2353 閱讀 5065

表結構:

create table `test` (

`id` bigint(20) unsigned not null auto_increment comment '自增id',

`a` varchar(100) not null default '' comment '唯一健',

`b` bigint(20) unsigned not null default '0' comment '',

`c` tinyint unsigned default 0 comment '',

`d` bigint(20) unsigned not null default '0'comment '',

primary key (`id`),

unique key `uniq_a` (`a`),

key `idx_b_c` (`b`, `c`)

) engine=innodb auto_increment=1 default charset=utf8mb4 comment='測試表';

插入語句:

insert test(a,b) values(1,1);

insert test(a,b) values(2,2);

insert test(a,b) values(3,2);

insert test(a,b) values(4,4);

insert test(a,b) values(5,5);

事務一:

update test set d=1 where a = '2' and b= 2 and c in (0);

事務二:

update test set d=1 where a = '3' and b= 2 and c in (0);

發生了鎖等待:

mysql [gifshow]> select * from information_schema.innodb_locks\g;

*************************** 1. row ***************************

lock_id: 458673016:562:5:3

lock_trx_id: 458673016

lock_mode: x

lock_type: record

lock_table: `gifshow`.`test`

lock_index: idx_b_c

lock_space: 562

lock_page: 5

lock_rec: 3

lock_data: 2, 0, 2

*************************** 2. row ***************************

lock_id: 458672622:562:5:3

lock_trx_id: 458672622

lock_mode: x

lock_type: record

lock_table: `gifshow`.`test`

lock_index: idx_b_c

lock_space: 562

lock_page: 5

lock_rec: 3

lock_data: 2, 0, 2

疑問點?

explain  update test set d=1 where a = '2' and b= 2 and c in (0);

| id | select_type | table | partitions | type        | possible_keys  | key            | key_len | ref  | rows | filtered | extra                                        |

|  1 | update      | test  | null       | index_merge | uniq_a,idx_b_c | idx_b_c,uniq_a | 10,402  | null |    1 |   100.00 | using intersect(idx_b_c,uniq_a); using where |

update 語句為啥有唯一索引,為啥還要用到  index merge ? 以及什麼情況下會用到index merge?

同時做了個實驗:

如果用到了索引 idx_b_c  那  不應該加間隙鎖嗎?

事務一:

update test set d=1 where a = '2' and b= 2 and c in (0);

事務二:

insert test(a,b) values("1.5",2);

但是執行事務二並沒有發生鎖等待?

Java基礎 乙個死鎖問題

package cn.itcast 02 public class mylock package cn.itcast 02 public class dielock extends thread override public void run else package cn.itcast 02 同...

寫乙個死鎖

死鎖產生的原因 乙個執行緒進入鎖一需要鎖二,另乙個執行緒進入鎖二需要鎖一,由於鎖一鎖二都被佔了,所以執行緒執行不下去。所以只需寫乙個相互交叉的鎖一鎖二就可以產生死鎖。class sisuogoucheng implements runnable public void run if panduan ...

乙個執行緒死鎖問題的分析

客戶報過來乙個問題,伺服器執行一周左右就會停止響應,有時候甚至兩天就不響應了,併發使用者量並不大,重啟服務後又工作正常。每當遇到這種問題時就有點兒棘手。一是這種問題的復現條件不好確定,另一方面,即使確定了條件,對於多執行緒的服務程式,也不好除錯。我遇到過的這種問題,大部分是靠讀 分析出來乙個可能的原...