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)。修改方法见下章。

posted @ 2021-08-10 17:03  流水自净  阅读(219)  评论(0)    收藏  举报