对mysql的各种sql语句如何对表加锁的实验

TableA

+----+------+
| c1 | c2   |
+----+------+
|  3 | NULL |
|  4 | NULL |
|  5 | NULL |
| 11 |   12 |
| 12 |   13 |
+----+------+
一 在c1上无索引,innodb_locks_unsafe_for_binlog开关被关闭。
1  1.0 select * from ta where c1=11在read_repatable  isolation level的时候,另一个session是可以随便插入的任何值。
   1.1 如果是select * from ta where c1=11 lock in share mode它是对所有的行加S lock,另外一个session任何值都是不能插入的。
2  update ta set c1=17 where c1=11在read_repatable  isolation level的时候,对表中所有行加X行锁,另外一个session不能插入任何值。

二 当c1上有索引的时候,非cluster的,非unique的,innodb_locks_unsafe_for_binlog开关被关闭。
1  1.0 select * from ta where c1=11在read_repatable  isolation level的时候,另一个session是可以随便插入的任何值。
   1.1 如果是select * from ta where c1=11 lock in share mode 会对c1=11这一行加S锁,在C1<12上所有的行加上S gap锁,
   即另外一个session插入c1>=12是可以的,但是插入c1<12的值不成功。
2  update ta set c1=17 where c1=11在在read_repatable  isolation level的时候,对表中c1=11这一行加上X锁,对c1<12这个区间插入X gap锁,
    另外一个session插入c1>=12是成功的,但是插入c1<12的都是不可以的。

三 innodb_locks_unsafe_for_binlog开关被打开,index为clustered和unique的。。等等 分别去实验,好多,不写了。。

 

一个问题:

>select * from tb;
+------+------+
| c1   | c2   |
+------+------+
|    3 | NULL |
|    4 | NULL |
|    5 | NULL |
|    6 |   11 |
|   11 |   12 |
|   14 |   13 |
|   15 |   16 |
|    7 |   10 |
|    8 |   10 |
|    9 |   10 |
+------+------+

>show create table tb;

| tb    | CREATE TABLE `tb` (
  `c1` int(11) DEFAULT NULL,
  `c2` int(12) DEFAULT NULL,
  KEY `c1` (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

>set autocommit=0;
>select * from tb where c1=11;

经过验证的结果是:

lock monitor显示的加锁:                                 11加S锁,11的下一条加了S gap锁,
实际的操作是:                             【11前的一条,11,11后的一条)不能被插入

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值