锁主要是在多用户情况下保证数据库数据完整性和一致性。
锁的分类
分类属性 | 具体类型 |
---|---|
锁模式分类 | 乐观锁、悲观锁 |
范围锁 | 行锁、表锁 |
算法锁 | 临间锁、间隙锁、记录锁 |
属性锁 | 共享锁、排他锁 |
状态锁 | 意向共享锁、意向排他锁 |
update时会锁,delete时会锁,insert时不会锁。条件命中索引锁行,未命中索引锁全表。
行锁
行锁的触发是命中索引,条件命中几条就会锁几条。
-
特征:锁冲突概率低,并发性高,但是可能出现死锁。
-------------窗口A------------------- -- 关闭自动提交事务 set autocommit = 0; SELECT * from section where id = 2; -- 修改第二行插入者id update section SET insertor = 1 where id = 2; --------------窗口B------------------- -- 关闭自动提交事务 set autocommit = 0; -- 可以查询,查询出原来的结果 SELECT * from section where id = 2; -- 修改第二行插入者id update section SET insertor = 3 where id = 2; -- [SQL]update section SET insertor = 3 where id = 2; -- [Err] 1205 - Lock wait timeout exceeded; try restarting transaction -- 这行被锁住了无法更新。 --------------窗口C------------------- -- 关闭自动提交事务 set autocommit = 0; SELECT * from section where id = 3; -- 修改另一行的插入者id update section SET insertor = 3 where id = 3; -- 可以被正常更新
表锁
表锁响应的是非索引字段,只要有非索引字段进行匹配就会锁全表
- 特征:锁冲突几率低,不会出现死锁。