【发布时间】:2018-06-27 14:36:02
【问题描述】:
我正在尝试使用 VB.NET 编写多线程程序。这是一个简单的程序:转到数据库,获取一行,处理一些后端,然后更新该行并将其设置为“processed = true”。因为数据量大,所以打算做一个多线程的程序。
SELECT... FOR UPDATE 由于某种奇怪的原因似乎在事务中不起作用,因此我决定先发制人地将行标记为“正在读取 = TRUE”,然后从那里处理它。
是否可以更新行,然后从同一个 SQL 语句中检索行 ID?
我尝试过同时使用这些 SQL 语句:
Dim sqlUpdateStatement As String = "SET @uid := 0;UPDATE process_data SET reading = TRUE, idprocess_data = (SELECT @uid := idcrawl_data) WHERE reading IS NOT TRUE AND processed IS NOT TRUE LIMIT 1;SELECT @uid;"
但它告诉我在命令执行过程中遇到了致命错误。
有什么想法吗?
编辑
经过一些测试,我得出结论,在 VB.Net 中执行更新时不能使用 MySQL 变量。这是真的?如果是这样,是否有解决方法?
【问题讨论】:
-
这应该在存储过程中完成。也许换一种方式想,而不是一次选择 1 个。选择所有需要修改的内容并将该列表发送到您的线程并让它处理。完成后,获取要修改的新 id 列表。
-
我认为您可能不得不求助于使用
for update trigger并从触发器内的Inserted表中获取 Id。 This question/answer 看起来和你的很像,答案与触发器有关 -
@the_lotus 后端要求处理是逐行完成的......
-
你应该使用存储过程.....
-
“因为数据量太大,我打算为它做一个多线程的程序。” - 这不是很好的理由。如果你说“因为有这么多 基于 CPU 的计算,我打算为它做一个多线程程序。”那你就赢了。处理大量数据需要大量带宽 - 多线程对此无济于事。