python - mysql并发访问:做一个锁以避免任何更新raws的选择
问题描述
我想为表的每个 raw 应用一个并行和并发进程,并且每个进程都必须采用唯一的 raw。
我有一个 mysql 表,其中包含一个名为 trigger 的默认 Null 字段值。在每个并行进程开始时,该进程选择一个 Null 原始数据:
SELECT table_id from table where trigger is Null limit 1
然后立即在第二个请求中,该过程执行更新:
UPDATE table set trigger = 1 where table_id = [#previous_select_table_id]
使用该流程,通常每个流程的每个原始文件都会有所不同。我遇到的问题是,有时在两个请求(选择和更新)之间的时间段内,两个或多个进程可以选择相同的空原始数据,因为它们没有时间更新原始值和设置值。您是否有任何想法如何在同一查询或其他想法中进行选择和更新,以确保不能在同一时间选择原始数据?我用蟒蛇。非常感谢 !
解决方案
第一个问题是这是两个独立的事务。所以首先是将它们合二为一。
START TRANSACTION
SELECT table_id from table where trigger is Null limit 1 FOR UPDATE
[do stuff]
UPDATE table set trigger = 1 where table_id = [#previous_select_table_id]
COMMIT
第二个方面是这种选择未处理数据并将其从考虑中删除的形式是一个队列。数据库实现队列对他们来说不是一件自然的事情。使用 RabbitMQ 之类的消息队列或其他方式。即使您在查询中输入的只是一个 table_id。
还要小心使用保留字,如trigger
表列。
推荐阅读
- sql-server - 生成脚本向导脚本模式和数据以忽略“GO”
- sapui5 - sapui5 如何在径向图上显示超过 100% 的值
- css - 伪元素似乎在 Salesforce 闪电 CSS 中不起作用
- r - 数据集中的每月虚拟变量
- java - 与 AppBarLayout 重叠或重叠的 SwipeRefreshLayout 滚动问题
- java - 初始化后将标题添加到 Jtable
- swift - 翻转和镜像数字
- spring-boot - 使用 Rest Assured 和 Spring Rest Docs 找不到授权标头
- java - 将 jar 文件下载到 R 包的 inst/java 目录中
- javascript - JS中的长版函数