****悲观锁与乐观锁****
悲观锁,也叫悲观并发控制,当事务A对某行数据应用了锁,并且当这个事务把锁释放后,其他事务才能够执行与该锁冲突的操作,这里事务A所施加的锁就叫悲观锁。
看到这里,会发现,我们之前学习的共享锁和排他锁(行锁,间隙锁,next-key lock)都属于悲观锁。
乐观锁,也叫乐观并发控制,它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,那么当前正在提交的事务会进行回滚。
****悲观锁与乐观锁的实现方式****
悲观锁的实现依靠的是数据库提供的锁机制来实现,例如select * from news where id=12 for update,而乐观锁依靠的是记录数据版本来实现,即通过在表中添加版本号字段来作为是否可以成功提交的关键因素。
根据之前对锁的学习,我们可以大概可以看到innodb下各个锁之间的关系,如图:
无论哪种锁,其实都是为了解决某类问题而出现,接下来,我们将介绍如何分析sql语句使用了哪种锁以及死锁的相关知识。