接上篇Mysql 事务上
一、锁的基本类型
行锁,表锁
类别 | 性能 |
---|---|
锁定粒度 | 表锁 > 行锁 |
加锁效率 | 表锁 > 行锁 |
冲突概率 | 表锁 > 行锁 |
并发性能 | 表锁 < 行锁 |
表锁
lock tables xxx read;
lock tables xxx write;
unlock tables ;
行锁
共享锁(行锁) : Shared Locks
排它锁(行锁) : Exclusive Locks
意向共享锁(表锁) : Intention Shared Locks
意向排它锁(表锁) : Intention Exclusive Locks
二、常用锁介绍
行锁之共享锁(Shared Locks)
共享锁:又称为读锁, 简称S锁, 顾名思义, 共享锁就是多个事务对于同一数据可
以共享一把锁, 都能访问到数据, 但是只能读不能修改;
加锁释锁方式:
select * from student where id=1 LOCK IN SHARE MODE;
commit/rollback;
行锁之排它锁(Exclusive Locks)
排它锁又称为写锁, 简称X锁, 排他锁不能与其他锁并存, 如一个事务获取了一
个数据行的排他锁, 其他事务就不能再获取该行的锁(共享锁、 排他锁) , 只有
该获取了排他锁的事务是可以对数据行进行读取和修改。
加锁释锁方式:
自动: delete / update / insert 默认加上X锁;
手动: select * from student where id=1 FOR UPDATE;
commit/rollback
表锁之意向共享锁(IS) / 意向排它锁(IX)
意向锁是由数据引擎自己维护的, 用户无法手动操作意向锁 。
- 意向共享锁(Intention Shared Lock, 简称IS锁)
表示事务准备给数据行加入共享锁, 也就是说一个数据行加共享锁前必须先取得该表的IS锁。 - 意向排他锁(Intention Exclusive Lock, 简称IX锁)
表示事务准备给数据行加入排他锁, 说明事务在一个数据行加排他锁前必须先取得该表的IX锁。
三、锁的作用
索引使用 | 锁情况 |
---|---|
不使用索引 | 锁全表 |
主键索引 | |
唯一索引 |
RC和RR的主要区别:
1、 RR的间隙锁会导致锁定范围的扩大。
2、 条件列未使用到索引, RR锁表, RC锁行。
3、 RC的“半一致性” (semi-consistent) 读可以增加update操作的并发性。
四、死锁的避免
1) 顺序访问
2) 数据排序
3) 申请足够级别的锁
4) 避免没有where条件的操作
5) 大事务分解成小事务
6) 使用等值查询而不是范围查询