您的位置:首页 > 数据库 > MySQL

mysql 锁 实验

2016-06-24 18:02 471 查看
CREATE TABLE `kk` (
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`c` int(11) NOT NULL,
PRIMARY KEY (`a`),
UNIQUE KEY `bb` (`b`),
KEY `cc` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


mysql> select * from kk;
+---+----+----+
| a | b  | c  |
+---+----+----+
| 1 | 10 | 20 |
| 3 | 13 | 23 |
| 5 | 15 | 25 |
| 7 | 17 | 27 |
| 9 | 19 | 29 |
+---+----+----+
5 rows in set (0.16 sec)


铺助索引 主健

a=5        recordlock[5]

a<5 next_keylock[1,3,5]

a<=5 next_keylock[1,3,5,7]

a>5 next_keylock[7,9,sup]

a>=5 next_keylock[5,7,9,sup]

b=15 recordlock[5] recordlock[5]

b<15 next_keylock[10,13,15] recordlock[1,5]

b<=15 next_keylock[10,13,15,17] recordlock[1,3,5]

b>15 next_keylock[17,19,sup] recordlock[17,19]

c=25 next_keylock[25] ,caplock[27] recordlock[25]

c<25 next_keylock[20,23,25] recordlock[20,23]

c<=25 next_keylock[20,23,25,27] recordlock[20,23,25]

c>25 next_keylock[27,29,sup] recordlock[27,29]

rr级别: 解决不可重复读,幻读

set tx_isolation="REPEATABLE-READ"

select * from kk where a ... for update

select * from kk where b ... for update

select * from kk where c ... for update

RR:对打开的游标都需要加锁,直到不满足条件那条记录

RC:只对满足条件的记录加锁

RR:

NEXT-KEY-LOCK-------唯一等值查询---- 转换为RECORD LOCK

select * from kk force index(primary) where a.. for update; 防数据量小,走全表,不走索引,会全表锁

单个事务插入一条记录,不对该条记录的下一条记录加插入意向锁

如果要插入记录的位置的下一条记录有CAP LOCK | NEX-KEY LOCK,就会在该记录加上插入意向锁,等待插入,如果下一条记录是RECORD LOCK,就直接插入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: