Django 悲观锁与乐观锁
当修改数据库数据时需要先使用该数据时,在多线程时就会出现资源竞争问题,尤其是并发量高时,就会导致严重的错误。
为了数据的安全,对数据库的重要数据的查询与修改必须同步执行。
悲观锁
将要查询并修改的数据暂时锁住,不允许别的线程使用。
弊端:容易发生死锁现象。
# sql命令:select stock from tb_sku where id=1 for update;
Model.objects.select_for_update().get(id=1)
乐观锁
在修改数据时先查询数据是否被修改,将查询与修改同步执行。
while True:
# 查询数据
m = Model.objects.get(id=1)
# 操作数据
count = m.count + ?
# 查询原来的数据并修改
if Model.objects.filter(id=1, count=m.count).update(count=count):
# 查询修改成功。
break
else:
# 查询失败,数据已被修改,重复
continue
使用乐观锁的时候,如果一个事务修改了库存并提交了事务,那其他的事务应该可以读取到修改后的数据值,
但是mysql默认的事务隔离级别是可重复读,无论是否有事务提交并修改了数据,其他事务读取的数据都不会改变。
所以需要修改事务隔离级别为读取已提交(Read committed)。修改方法见下章。
如果觉得本文有用,万望看官慷慨解囊,不吝打赏,激励本编提供更加优质的内容
[点击进行打赏](https://www.cnblogs.com/52note/p/16507868.html)