首页 > 解决方案 > 确保多线程池中的 SQL 查询顺序

问题描述

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

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

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

我目前正在使用 Twisted 和 MySQLdb:

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

d = pool.runOperation(query, args)

标签: pythonmysqltwisted

解决方案


我想出了一个办法来做到这一点。使用 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)

推荐阅读