悲观锁和乐观锁
锁的产生场景:
在程序中出现并发问题时,需要保证数据的一致性。不允许在数据更新过程出现更新丢失问题,为了解决这类问题,就可以给数据表加锁,常见的方式有两种,分别为乐观锁和悲观锁。
一, 悲观锁
悲观锁的应用场景是认为并发情况一定会发生,所以在某条数据被修改时,为了避免其他人修改,会直接对数据表加锁,他依靠的时数据库身提供的锁机制(表锁,行锁,读锁,写锁)。
二, 乐观锁
乐观锁与悲观锁相反,他认为数据产生冲突的情况一般不会发生,所以在修改数据的时候并不会对数据表进行加锁的操作,而是在提交数据时进行校验,判断提交上来的数据是否会发生冲突,如果发生冲突,则提示用户重新进行操作,一般的实现方式为“设置版本号字段”。
三, 举例
以商品的的售价为例,在表中设置一个版本号字段,让其初始为1,此时A管理员和B管理员同时需要修改售价,他们会先读取到数据表中的内容,此时两个管理员读取到的版本号都为1,此时B管理员的操作先生效了,他就会将当前数据表中对应数据的版本号与最开始读取到的版本号做一个对比,发现没有变化,于是修改就生效了,此时版本号加1.
而A管理员马上也提交了修改操作,但是此时的版本号为2,与最开时读取到的版本号并不对应,这就说明数据发生了冲突,此时应该提示A管理员操作失败,并让A管理员重新查询一次数据。
乐观锁的优势在于采取了更加宽松的加锁机制,能够提高程序的吞吐量,适用于读操作多的场景。