有个网友问我乐观锁和悲观锁的相关问题,于是就来阐述一下这个问题。首先说乐观锁,它是Pessimistic Lock的简写,也就是所谓的悲观锁。它是每次取数据的时候都会认为别人会修改它的数据,因此它是在每次取数据之前都会进行加锁操作,这样别人拿数据的时候就必须等待直到它释放锁。其实我们的关系型数据库中就用到了很多这种锁机制,比如行锁、表锁、写锁等等,都是在操作之前首先加一个锁。
所谓乐观锁,就是Optimistic Lock的缩写,也就是所谓的乐观锁。它每次取数据的时候都认为别人不会去改数据,所以不会上锁,但是在每次更新的时候都会去判断一下在此期间别人有没有更新这个数据,它可以使用多版本机制实现。乐观锁通常用于多读操作的应用,这样可以极大的提高吞吐量。比如读锁通常就是乐观锁。
可能有人会提到MVCC,一般来说,MVCC是乐观锁的一种实现方式,其实就是主要的实现方式。因此,就一般来说,我们可以把非MVCC实现的锁叫做悲观锁,而通过MVCC实现的锁,叫做乐观锁。
更有甚者,直接把乐观锁和MVCC划等号,这样严格来说并不合适,毕竟MVCC是实现方式,而乐观锁则是锁的概念,两者并不是概念上的等同。