前言
简单介绍一下,在mysql 优化系列中会重新介绍,仅仅是留个印象。
悲观锁和乐观锁其实都是概念性问题。
正文
悲观锁:
悲观锁,正如其名,具有强烈的独占和排他特性。
它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。
悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
这个其实就是数据库帮助你加锁,认为每次获取数据都会被其他线程修改,每次来操作数据的时候都会加锁,这就可以就看上一章的读锁和写锁了。
乐观锁:
认为每次读取后,数据在一般不会发生冲突,在读取操作的时候不会去添加锁。
首先是什么问题产生了这个悲观锁和乐观锁的问题呢?
举个例子,这其实就是生活中一个很简单的例子。
比如有一辆公共汽车,你上车后,然后你要下车,这时候如何保证这个位置没有其他人坐呢?
最简单的方式就是放个书包,告诉我们这个位置有人了,相当于加锁。
但是这样性能是下降的,因为你得放书包啊,到时候你还得拿走。
那么这时候有人就认为这辆车没啥人,我就不去干书包这件事。
那么问题就来了,当我上车的时候如何万一有人怎么办?
这就是乐观锁得了方便,但是也是要解决的问题。
回到数据库乐观锁问题上,乐观锁的一种解决方法就是加一个版本号。
就是读取的时候,把版本号读取出来,修改的使用加上版本号作为条件。
如果版本号没有修改,那么就修改,如果版本号修改了,那么就另外加入队列中或者立即重新执行。