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