【Django】Django如何保证并发操作数据一致性问题

代码示例:

使用 select for update 数据库查询

select ... for update 是数据库层面上专门用来解决并发取数据后再修改的场景的,主流的关系数据库 比如mysql、postgresql都支持这个功能, 新版的Django ORM甚至直接提供了这个功能的shortcut 。 关于它的更多介绍,你可以搜索你使用的数据库的介绍文档。

使用 select for update 后,我们的代码可能会变成这样:

复制代码 代码如下:

from django.db import transaction
class NotificationController(object):

    ... ...

    def mark_as_readed(self, notification_id):
        # 手动让select for update和update语句发生在一个完整的事务里面
        with transaction.commit_on_success():
            # 使用select_for_update来保证并发请求同时只有一个请求在处理,其他的请求
            # 等待锁释放
            notification = Notification.objects.select_for_update().get(pk=notification_id)
            # 没有必要重复标记一个已经读过的通知
            if notication.has_readed:
                return

            notification.has_readed = True
            notification.save()
            # 在这里更新我们的计数器,嗯,我感觉好极了
            self.update_unread_count(-1)

除了使用``select for update``这样的功能,还有一个比较简单的办法来解决这个问题。

附: http://www.cnblogs.com/wanself/archive/2012/12/17/2822185.html  Django-MySQL连接池

参考资料:

http://www.thinksaas.cn/topics/0/67/67994.html

https://segmentfault.com/q/1010000007427202

http://blog.csdn.net/ysjian_pingcx/article/details/51015988

http://codego.net/19104/

乐观锁、悲观锁:

Select For update语句浅析:  http://blog.csdn.net/liqfyiyi/article/details/7948282

JAVA-mysql悲观锁总结和实践: http://chenzhou123520.iteye.com/blog/1860954   -- 占座类比

JAVA- mysql乐观锁总结和实践: http://chenzhou123520.iteye.com/blog/1863407  -- SVN就是乐观锁

JAVA-未知驱动学习--数据库中的悲观锁和乐观锁实例: http://blog.csdn.net/lovesummerforever/article/details/11285663 

以上是悲观锁的实例, 而乐观锁与悲观锁是相对的, 不是在读取这条数据的时候加锁而是在更新这条数据的时候加锁. 就相当于两个管理员同时在修改一个公司职员的信息时, 悲观锁是不允许同时修改的, 而乐观锁, 他们可以同时修改, 并且以最先保存结果的人为最后的保存结果, 同时通知另一个管理员无法保存的事实.

抛开计算机的世界, 你喜欢哪种性格的人呢?悲观?乐观? 我想做人要乐观, 做事要悲观. 做事我们必须要把坏结果提前想到, 并且做出一些必要的措施, 您说呢?

原文地址:https://www.cnblogs.com/junneyang/p/6297177.html