上一篇我们说了,如何在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资源。此时就导致了死锁。我们一般通过设置超时时间来处理这个问题。
悲观锁可以有效的降低冲突后,重试的次数
乐观锁可以提高响应速度