【问题标题】:Ensuring SQL query order in multithread pool确保多线程池中的 SQL 查询顺序
【发布时间】:2021-11-24 12:53:07
【问题描述】:

我正在制作一个小游戏,并使用 MySQL 作为数据库。由于多线程池,我在保存时遇到了一点问题。当我提交插入/删除时,比如添加或删除项目,不能保证它们按照提交的顺序完成。这最终会在一些罕见的情况下创建重复项。

例如,如果我添加和删除一个项目(插入、删除),通常没问题。但是,连续执行 3 次,它会提交 Insert、delete、insert、delete、insert、delete。但是偶尔可能会导致删除、插入、插入、删除、删除、插入。

在这种情况下,我可以确保单个查询链的正确方法是什么?我是否尝试在代码中组合查询?忘记池化连接并确保它是有序的?还有其他解决方案吗?

我目前正在使用 Twisted 和 MySQLdb:

pool = adbapi.ConnectionPool('MySQLdb', host=127.0.0.1, port=3306, user='..', passwd='..', db='testing')

d = pool.runOperation(query, args)

【问题讨论】:

    标签: python mysql twisted


    【解决方案1】:

    我想出了一个办法。使用 Twisted 的内置延迟链接延迟,以便下一个仅在最后一个完成时继续。

        def _continueQuery(self, result, player, query):
            return dbPool.runOperation(*query)
    
        def _savePlayer(self, player):
            if player.queries:
                initialQuery = player.queries.pop(0)
                d = dbPool.runOperation(*initialQuery)
                while player.queries:
                    query = player.queries.pop(0)
                    d.addCallback(self._continueQuery, player, query)
    

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      相关资源
      最近更新 更多