MySql - 多线程软件,如何锁定行以防止被其他线程读取

时间:2018-01-23 12:32:33

标签: c# mysql multithreading

我在 MySql

中有一个用户表

结构:

ID - big int
文字 - Varchar
Verified = false(默认情况下)
默认情况下为Thread = false /当线程与当前行一起使用时设置为true。

工作流

  1. 按条件排序
  2. 将线程设置为true以防止其他线程使用它们
  3. 做魔术
  4. 设置验证为真
  5. 设置线程错误
  6. 问题是我有5个或更多线程。在第2步结束之前,其他线程获得相同的行。从90个线程,最多40%可以在同一行工作。在请求之前添加随机时间并没有多大帮助。

    我的问题是:如何临时锁定行,以防止被其他线程读取?

1 个答案:

答案 0 :(得分:1)

您可以对InnoDB记录应用独占锁定:

SELECT * FROM table WHERE id = 666 FOR UPDATE;

因此,其他用户/线程无法读取您锁定的这些记录。

由于锁定将在事务结束时自动释放。因此,您通常需要通过START TRANSACTIONBEGIN启动交易,并将上述语句放入此交易中。