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 @   流水自净  阅读(206)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示