【问题标题】:Multi-Threaded VB.net: Update then return row id?多线程VB.net:更新然后返回行ID?
【发布时间】: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 的计算,我打算为它做一个多线程程序。”那你就赢了。处理大量数据需要大量带宽 - 多线程对此无济于事。

标签: database vb.net


【解决方案1】:

我最终花时间调试了我的代码的 SELECT FOR UPDATE 部分,让它在事务的基础上工作。感谢大家的宝贵时间!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多