锁
从锁的性能有乐观锁和悲观锁;锁的粒度有行锁、页锁、表锁;锁的对数据库操作类型有读锁、写锁、意向锁
- 乐观锁:采用cas机制,不会阻塞数据库操作,只会针对当前事务进行失败重试。(用于写操作不多的情况)
- 悲观锁:锁住操作的数据,阻塞其他事务对同一资源的操作。
- 行锁:锁住一行数据
InnoDB中,行锁是加载索引上的,
1.在RR隔离级别中,加锁过程中没有找到索引则会升级为表锁
2.在RC隔离级别中,加锁过程中没有找到索引则不会有锁升级 - 表锁:锁住整张表,
‐‐手动增加表锁
lock table 表名称 read(write),表名称2 read(write);
‐‐查看表上加过的锁
show open tables;
‐‐删除表锁
unlock tables;
页锁:只有BDB存储引擎支持,锁住索引页。
间隙锁(Gap Locak):间隙锁在RR隔离级别生效,会锁住索引件的间隙(比如用a进行锁)
当拥有索引的a进行加锁,则(111-120)都会被锁住。读锁:(共享锁、S锁(Shared)):select … lock in share mode;
读锁是共享的,多个事务可以同时读取同一个资源,但不允许其他事务修改。写锁:(排他锁、x锁(exclusive)):select … for update;
写锁是排他的,会阻塞其他的写锁和读锁,update、delete、insert都会加写锁。读锁和写锁是悲观锁
意向锁(Intention Lock):又称I锁,为了提高表锁效率而增加。mysql进行表锁时会扫描表中是否存在读锁或者写锁,当有事务给表的数据行加了共享锁或排他锁,同时会给表设置一个标识,代表已经有行锁了,其他事务要想对表加表锁时,就不必逐行判断有没有行锁可能跟表锁冲突了,直接读这个标识就可以确定自己该不该加表锁。