mysql乐观锁和悲观锁详解
相信很多朋友在面试的时候,都会被问到乐观锁和悲观锁的问题,如果不清楚其概念和用法的情况下,相信很多朋友都会感觉很懵逼,那么面试的结果也就不言而喻了。
那么乐观锁和悲观锁到底是个什么东西,用它能来做什么呢?
相信大家都遇到这种场景,当很多人(一两个人估计不行)同时对同一条数据做修改的时候,那么数据的最终结果是怎样的呢?
这也就是我们说的并发情况,这样会导致以下两种结果:更新错误,你修改之后的数据可能被别人覆盖了,导致你很懵逼,甚至怀疑自己开发的功能是否有问题;
脏读,数据更新错误,导致读数据也是错的,查询出一些默认奇妙的数据,看到的不是你自己修改的结果。
这样的问题怎么解决呢?于是乎,锁就这样产生了,锁分为乐观锁和悲观锁,它的目的是用来解决并发控制的问题。
MyISAM引擎不支持事务,所以不考虑它有乐观锁和悲观锁概念。MyISAM只有表锁,锁又分为读锁和写锁。在这里我们只讨论InnoDB引擎。
需要注意的是,乐观锁和悲观锁并不是解决并发控制的唯一手段(也可以使用消息中间件kafka,MQ之类的作为缓冲等等),而且乐观锁和悲观锁并不仅限制在mysql中使用,它是一种概念,很多其他的应用,如redis,memcached等,只要存在并发情况的,都可以应用这种概念,只是方式上有些差别而已。
一、乐观锁
乐观锁,简单地说,就是从应用系统层面上做并发控制,去加锁。
实现乐观锁常