mysql rc模式_MySQL RC模式insert update 可能死锁的情况

涉及的语句为

RC模式下

update根据主键更新和insert

其实这样的问题在RC模式下,要么是简单update问题,要么是insert造成的主键和唯一键检查唯一性时出现问题。

下面以主键问题为列子进行分析一下可能出现的情况。

update  where条件更新为主键,锁结构出现在单行主键上,辅助索引包含隐含锁结构,当前读RC非唯一索引模式没有GAP锁,

insert  插入印象锁,主键和辅助索引上会出现隐含锁结构,

但是在RC模式下没有GAP所以插入印象锁一般不会成为问题

表结构:

+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table  | Create Table                                                                                                                                                                      |

+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| testlll | CREATE TABLE `testlll` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(20) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 |

+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

情况1

insert

update

TX1:                                                                  TX2:

insert into testlll(name) values('gaopeng');

insert into testlll(name) values('gaopeng');

update testlll set name='gaopeng1' where id=25;(堵塞)

update testlll set name='gaopeng1' where id=24;(堵塞)

死锁

锁结构:

---TRANSACTION 322809, ACTIVE 30 sec starting index read

MySQL tables in use 1, locked 1

3 lock struct(s), heap size 1160, 2 row lock(s), undo log entries 1

MySQL thread id 3, OS thread handle 140734663714560, query id 409 localhost root updating

update testlll set name='gaopeng1' where id=24

---lock strcut(1):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

TABLE LOCK table `test`.`testlll` trx id 322809 lock mode IX

---lock strcut(2):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322809 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)

Record lock, heap no 25 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 80000019; asc ;;

1: len 6; hex 00000004ecf9; asc ;;

2: len 7; hex f0000001f90110; asc ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

---lock strcut(3):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322809 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

Record lock, heap no 20 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 80000018; asc ;;

1: len 6; hex 00000004ecf8; asc ;;

2: len 7; hex ef000001f80110; asc ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

---TRANSACTION 322808, ACTIVE 43 sec starting index read

mysql tables in use 1, locked 1

LOCK WAIT 3 lock struct(s), heap size 1160, 2 row lock(s), undo log entries 1

MySQL thread id 2, OS thread handle 140734663980800, query id 408 localhost root updating

update testlll set name='gaopeng1' where id=25

------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322808 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

Record lock, heap no 25 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 80000019; asc ;;

1: len 6; hex 00000004ecf9; asc ;;

2: len 7; hex f0000001f90110; asc ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

------------------

---lock strcut(1):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

TABLE LOCK table `test`.`testlll` trx id 322808 lock mode IX

---lock strcut(2):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322808 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

Record lock, heap no 25 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 80000019; asc ;;

1: len 6; hex 00000004ecf9; asc ;;

2: len 7; hex f0000001f90110; asc ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

---lock strcut(3):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 322808 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)

Record lock, heap no 20 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 80000018; asc ;;

1: len 6; hex 00000004ecf8; asc ;;

2: len 7; hex ef000001f80110; asc ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

情况2

update

update

TX1:                                                                    TX2:

update testlll set name='gaopeng1' where id=22;

update testlll set name='gaopeng1' where id=25;

update testlll set name='gaopeng1' where id=25;(堵塞)

update testlll set name='gaopeng1' where id=22;(堵塞)

死锁

这种情况比较简单不打印出锁结构

情况3

insert

insert

TX1:                                                      TX2:

insert into testlll values(26,'gaopeng');

insert into testlll values(27,'gaopeng');

nsert into testlll values(27,'gaopeng');(堵塞)

insert into testlll values(26,'gaopeng');(堵塞)

死锁

锁结构:

---TRANSACTION 422212176315800, not started

0 lock struct(s), heap size 1160, 0 row lock(s)

---TRANSACTION 323284, ACTIVE 10 sec inserting

mysql tables in use 1, locked 1

3 lock struct(s), heap size 1160, 2 row lock(s), undo log entries 1

MySQL thread id 2, OS thread handle 140734663980800, query id 369 localhost root update

insert into testlll values(26,'gaopeng')

---lock strcut(1):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

TABLE LOCK table `test`.`testlll` trx id 323284 lock mode IX

---lock strcut(2):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323284 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)

Record lock, heap no 27 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 8000001b; asc ;;

1: len 6; hex 00000004eed4; asc ;;

2: len 7; hex d3000002a10110; asc ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

---lock strcut(3):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323284 lock mode S(LOCK_S) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

Record lock, heap no 26 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 8000001a; asc ;;

1: len 6; hex 00000004eed3; asc ;;

2: len 7; hex d2000002330110; asc 3 ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

---TRANSACTION 323283, ACTIVE 14 sec inserting

mysql tables in use 1, locked 1

LOCK WAIT 3 lock struct(s), heap size 1160, 2 row lock(s), undo log entries 1

MySQL thread id 3, OS thread handle 140734663714560, query id 368 localhost root update

insert into testlll values(27,'gaopeng')

------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323283 lock mode S(LOCK_S) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

Record lock, heap no 27 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 8000001b; asc ;;

1: len 6; hex 00000004eed4; asc ;;

2: len 7; hex d3000002a10110; asc ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

------------------

---lock strcut(1):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

TABLE LOCK table `test`.`testlll` trx id 323283 lock mode IX

---lock strcut(2):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323283 lock mode S(LOCK_S) locks rec but not gap(LOCK_REC_NOT_GAP) waiting(LOCK_WAIT)

Record lock, heap no 27 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 8000001b; asc ;;

1: len 6; hex 00000004eed4; asc ;;

2: len 7; hex d3000002a10110; asc ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

---lock strcut(3):(Add by gaopeng) In modify Version I force check all REC_LOCK/TAB_LOCK for this Trx

RECORD LOCKS space id 434 page no 3 n bits 96 index PRIMARY of table `test`.`testlll` trx id 323283 lock_mode X(LOCK_X) locks rec but not gap(LOCK_REC_NOT_GAP)

Record lock, heap no 26 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 8000001a; asc ;;

1: len 6; hex 00000004eed3; asc ;;

2: len 7; hex d2000002330110; asc 3 ;;

3: len 7; hex 67616f70656e67; asc gaopeng;;

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值