悲观锁和乐观锁作为一种同步机制的编程思想,所谓悲观锁,就是无论什么情况,都担心数据被篡改,造成不安全问题。它本质上还是采用的数据库本身的同步机制,对记录进行上锁,在此期间,只有当前会话能对其进行读写操作,其他线程只能处于阻塞状态进行等待锁的释放,一旦并发量增加,吞吐量会急剧下降。而乐观锁为了提高运行效率,只在最后修改的时候进行CAS操作,也就是比较与交换,数据库中它是这样实现的,有点类似与Java中的带版本号的Atomic类,这样做能防止ABA问题,就是一条记录,原本字段值为A,现在业务要求将其修改为C,那么需要将持有的期待值与当前要被修改的值进行比较,但由于多线程的原因。可能在此操作前,业务线程被挂起。其他线程获得执行权后,将A修改为B,又有其他线程将B修改为A,此时,虽然A与期待值一致,但当中发生过修改,也是属于不安全的。为了解决这一问题,就提出了带版本号的CAS操作,每次操作后,将版本号递增,当进行修改时,将期待的版本号与持有版本号进行比对,若一致,则进行修改,反之不允许修改。这样的操作利于控制,虽然长时间的自选会导致开销巨大,但是可以人为的干预,通过设置重试次数或超时等。
