python - 确保多线程池中的 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)
解决方案
我想出了一个办法来做到这一点。使用 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)
推荐阅读
- angular - 为 angular-material-fileupload 注入自定义服务 - 找不到模块错误
- visual-studio-code - Visual Studio Code:更改使用的 CMake 安装
- flutter - Flutter:如何通过使用时间和超时来计算总工作时间
- statistics - 测试和训练分布之间的哪个统计测试
- python-3.x - Selenium 无法在电子邮件模板中找到按钮
- javascript - react中的嵌套路由
- python - 如何将字典存储在文件中(Python)
- ios - 多人连接自动连接
- java - 在 Android java 应用程序中使用服务帐户连接到 google Drive API v3
- go - 在链式方法调用中使用`defer`会发生什么?