对mysql的各种sql语句如何对表加锁的实验
2012-08-20 18:25
351 查看
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的。。等等 分别去实验,好多,不写了。。
+----+------+
| 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后的一条)不能被插入
相关文章推荐
- MySQL 索引详解(并包括了如何分析SQL语句的问题)(强烈推荐)
- mysql中获取一小时、一天、一周、一月时间数据的各种sql语句写法
- mysql中获取一天、一周、一月时间数据的各种sql语句写
- 如何记录MySQL执行过的SQL语句
- 如何记录MySQL执行过的SQL语句?
- mysql里面如何用sql语句让字符串转换为数字
- MySql update inner join!MySql跨表更新 多表update sql语句?如何将select出来的部分数据update到另一个表里面?
- 如何查找MySQL中查询慢的SQL语句
- Mysql如何批量删除具有相同表前缀的数据表(纯SQL语句)
- mysql中获取一天、一周、一月时间数据的各种sql语句写法
- mysql通过sql语句如何批量去掉某一个表中某一个字段的下面的相同部分字符串
- mysql小备忘:如何记录长时间执行的sql语句
- 如何查找MySQL中查询慢的SQL语句
- mysql如何用一条sql语句实现不存在就插入,存在的话则更新
- 如何记录MySQL执行过的SQL语句?
- 2013-01-23 10:13 MySQL中如何用一句SQL语句将多行多列合并成一行一列显示(转)
- 在jmeter测试mysql中如何一次运行多条sql语句
- 如何查询mysql中执行效率低的sql语句
- 如何减少对Mysql的访问以优化SQL语句
- 【SQL】如何一次(一条SQL语句)向ORACLE中插入多组/多条数据,不同于mysql