什么是锁?在多进程(线程)编程中为了数据的一致性、有效性,如果一资源被某进程(线程)上锁,那么在释放锁之前其他进程(线程)无法进行操作或者等待获取(上)锁。
一、悲观锁
悲观锁(Pessimistic locking),顾名思义对待任何事务都持悲观态度,做任何事情都会认为会有竞抢行为~所以在进行任何操作之前都要做好万全准备(上锁)才会继续执行后续的操作。通常是利用系统提供的锁机制来实现。
比如:
1 | Mysql中的上锁命令:for update、lock in share mode等 |
二、乐观锁
乐观锁(Optimistic locking),和悲观锁相反对待任何事务都持乐观态度,只会在最后即将执行操作的时刻前才会进行验证。通常是通过程序配合来实现。
比如:
1 | update `orders` set hash = md5(now()) where uid = 1 and hash = {lastHash}; |
三、优缺点
悲观锁优点很鲜明,因为每次执行的操作都是独占的,数据的一致性、有效性、安全性较高。但缺点同样突出,每次操作都会产生上锁的开销,在并发请求比较密集的情况下容易阻塞或者驳回请求,甚至是造成死锁,也大大降低了系统的性能。
乐观锁优点是省去了锁的开销,能较高的提高系统吞吐量,缺点是如果出现在并发高且竟抢(冲突)行为比较多的场景下数据的一致性很难保证。