概述
锁分类
操作
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
粒度
表锁(偏读)
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,
发生锁冲突的概率最高,并发度最低。
行锁()
偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,
发生锁冲突的概率最低,并发度也最高。
锁
表锁
#查看锁
show open tables;
#表上锁
lock table mylock read;
#解锁
unlock tables;
session1读锁表mylock
session1不能更改表,也不能访问其他没有加锁的表
session2可以访问任何表,但更改该表进入阻塞状态,直到session1解锁。
session1加写锁表
session1自己可以读,写
session2不可以读写该表
行锁
InnoDB存储引擎默认事务可重复读,行锁
偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,
发生锁冲突的概率最低,并发度也最高。
InnoDB与MyISAM的最大不同有两点:
一是支持事务(TRANSACTION);
二是采用了行级锁
事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。
l 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
l 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
l 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
l 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
开始时都设置autocommit=0;
默认的事务隔离级别为可重复读
session1可以看到自己已修改但未提交的数据,
session2读取不到
若autocommit=1时,则查询的数据为最新提交的。
session1更新id为1
session2更新id也为1,则session2会阻塞,直到session1提交
若session更新id不同,则相互无影响
索引失效行锁变表锁
如果执行sql时,条件出现类型转换,索引失效,行锁会变表锁
Session_1Session_2正常情况,各自锁定各自的行,互相不影响,
一个2000另一个3000由于在column字段b上面建了索引,
如果没有正常使用,会导致行锁变表锁比如没加单引号导致索引失效,
行锁变表锁被阻塞,等待。只到Session_1提交后才阻塞解除,完成更新
间隙锁
如何锁定一行
行锁总结