怎样减少行级锁对性能的影响
MySQL的行级锁是在引擎层有各个引擎自己实现的。但并不是所有的引擎都支持行级锁,比如MyISAM引擎就不支持行级锁。
不支持行级锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上的任何时刻只能有一个更新在执行,这就会影响到业务的并发度,InnoDB是支持行锁的。这也是InnoDB用来代替MyISAM的原因之一。
从两阶段锁说起
在下面的操作序列中,事务B的update语句执行时会是什么现象呢?假设字段id是表t的主键。
这个问题的结论取决于事务A在执行完两条update语句后,持有哪些锁,以及在什么时候释放。
实际上事务B的update语句会被阻塞,直到事务A执行commit之后,事务才会继续执行。
也就是说,在InnoDB引擎中,行锁是在需要的时候才加上的,但并不是不需要了就立即释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。
这个有什么用呢?
如果你的事务中需要锁多个行,要把最可能造成的锁冲突、最可能影响并发度的锁尽量往后放。
假设顾客A要在影院B购买电影票。
- 从顾客A账户余额中扣除电影票的票价
- 给影院B的账户余额增加上去
- 记录一条交易日志
(相当于转账)
从上面的分析来看我们需要两条update语句和一条insert语句,当然为了保证原子性操作&#x