MySql之InnoDB锁
1.行锁和表锁 表锁:不会出现死锁,发生锁冲突几率高,并发低。MyISAM和INNODB都支持 行锁:会出现死锁,发生锁冲突几率低,并发高。INNODB才支持 2.行锁的类型 行锁又分为共享锁,排他锁。 共享锁:读锁,多个事物可以对同一个数据共享同一把锁,持有锁的事物都可以访问数据,但是只能读不能修改 排他锁:写锁,只有一个事物能够获得排他锁,其他事物都不能获取该行的锁,不允许其他事务写,但允许读。更不允许其他事务给这几行上任何锁。innodb会对update\delete\insert语句制动添加排他锁 上共享锁的写法:lock in share mode 上排它锁的写法:for update 不过值得注意的是InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁 3.间隙锁 间隙锁是在在索引记录间隙中的一种锁,或者是锁在第一个之前或最后一个之后。 MVCC使RR级别下,事物当前读来避免了读情况下出现幻读的问题,于是就有了间隙锁。间隙锁也属于排他锁。 间隙锁锁住的是一个区间,而不仅仅是区间中的每一条数据。 例如:
SELECT * FROM table WHERE id BETWEN 1 AND 10 FOR UPDATE; 在上诉这个例子中(1,10)区间内的记录都会被锁锁锁住,但是1和10两条记录都不会被锁住 间隙锁在使用唯一索引查询唯一行记录是不需要的,例如id列有唯一索引,那么下面语句只会对id=100的行使用索引记录锁定,其他会在这行记录之前插入也没有关系。不会影响查询结果。如果id不是索引列或不是唯一索引列,那么这条语句就 会锁定10之前的所有间隙
SELECT * FROM child WHERE id = 10;
在这种情况下就会锁住字段A 2-5之间的间隙和字段c5-10之间的间隙
|