zoukankan      html  css  js  c++  java
  • Django中管理并发操作

    上一篇我们说了,如何在Django中进行事务操作,数据的原子性操作

    涉及了事务操作,我们不得不考虑的另一个问题就是:并发操作

    还是那个用户转账的操作

      我们使用事务操作解决的操作中途服务器宕机问题

    但是,如果有两条请求同时修改一条记录该怎么办?

    我们可以使用select_for_update函数

    select_for_update使用的是悲观锁

    使用select_for_update内部执行的sql语句就是select...for update

    具体用法:

    models.UserInfo.objects.select_for_update().get()

    注意:一定要让select_for_update在同一个事务中

    如果做的是金融的话建议还是使用悲观锁,这个会更加安全


    关于乐观锁

    乐观锁的出发点是:同一条数据很少会因为并发修改而产生冲突,适用于读多写少的操作,用以提高吞吐量

    实现方式:

      读取一个字段,执行处理逻辑,当需要更新数据的时候,再次检查该字段是否和第一次读取的一致。如果一致,则更新数据。否则拒绝更新,重新读取后再提交

    乐观锁与悲观锁的比较

    悲观锁可能会导致死锁的发生

      当A锁定了a资源,需要b资源。而b资源又被B锁定了,正在等待a资源。此时就导致了死锁。我们一般通过设置超时时间来处理这个问题。

    悲观锁可以有效的降低冲突后,重试的次数

    乐观锁可以提高响应速度

  • 相关阅读:
    牛客 小乐乐和25
    codeforces 1303 D 二进制瞎搞
    codeforces 1307 D 最短路bz+贪心
    codeforces 1316 C math
    codeforces 1328E LCA
    codeforces 1335 E2 思维
    codeforces 1335 E1 思维
    codeforces 1342 D 贪心+后缀和
    codeforces 1348D (思维+贪心)
    codeforces 1362 E 进制的性质
  • 原文地址:https://www.cnblogs.com/smiling-crying/p/9371341.html
Copyright © 2011-2022 走看看