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资源。此时就导致了死锁。我们一般通过设置超时时间来处理这个问题。

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

乐观锁可以提高响应速度

 

posted @ 2018-07-26 13:48  "%201  阅读(1619)  评论(0编辑  收藏  举报