- 封锁粒度
- MySQL提供了两种封锁粒度:行级锁、表级锁
- 应该尽量只锁定需要修改的那部分数据,而不是所有的资源。
- 锁定的数据量越少,发生锁争用的可能性就越小,系统的并发程度就越高。
- 但是加锁需要消耗资源,锁的各种操作(获取锁、释放锁、检查锁状态)都会增加系统开销。
- 因此封锁粒度越小,系统开销就越大。
- MySQL提供了两种封锁粒度:行级锁、表级锁
- 封锁类型
- 读写锁
- 排他锁(Exclusive),又称写锁
- 一个事务对数据对象A加了排他锁,就可以对A进行读取和更新。加锁期间其他事务不能对A加任何锁。
- 共享所(Shared),又称读锁
- 一个事务对数据对象A加了共享锁,就可以对A进行读取操作,但不能进行更新操作。加锁期间其他事务能对A加共享锁,但是不能加排他锁。
- 排他锁(Exclusive),又称写锁
- 意向锁(Intention Locks)
- 一个事务在获得某个数据行对象的S锁之前,必须先获得表的IS锁或者更强的锁
- 一个事务在获得某个数据行对象的X锁之前,必须先获得表的IX锁。
- 读写锁
- 两段锁协议:
- ① 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。
- ② 在释放一个封锁之后,事务不再申请和获得其它任何封锁。
- 可串行化调度:通过并发控制,使得并发执行的事务结果与某个串行执行的事务结果相同。
- 事务遵循两段锁协议是保证可串行化调度的充分条件,但不是必要条件。
- 隐式和显式锁定
- 隐式锁定:InnoDB存储引擎采用两段锁协议,会根据隔离级别在需要的时候自动加锁,并且所有的锁都是在同一时刻被释放。
- 显式锁定:InnoDB也可以使用特定的语句进行显式锁定。