• 【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 

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

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

  • 相关阅读:
    git学习记录——基础概念和文件的基本操作
    java 之 Properties 类
    java 之 Map类
    java 之 迭代器
    java 之 Collection类
    java 之日期时间操作
    java 之String类
    如何把ASP.NET MVC项目部署到本地IIS上
    [工具]Visual Studio
    [MVC][Shopping]Copy Will's Code
  • 原文地址:https://www.cnblogs.com/junneyang/p/6297177.html
Copyright © 2020-2023  润新知