Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MySql-多线程软件,如何锁定行以防止其他线程读取_C#_Mysql_Multithreading - Fatal编程技术网

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

C# MySql-多线程软件,如何锁定行以防止其他线程读取,c#,mysql,multithreading,C#,Mysql,Multithreading,我在MySql中有一个用户表 结构: ID-大整数 Text-Varchar 验证=假(默认情况下) Thread=默认情况下为false/当Thread处理当前行时设置为true 工作流 按我们的情况划船 将thread设置为true以防止其他线程使用它们 变魔术 设置验证为真 将线程设置为false 问题是当我有5个或更多线程时。在步骤2结束之前,另一个线程将获得相同的行。从90个线程中,多达40%的线程可以在同一行工作。在请求之前添加随机计时并没有太大帮助 我的问题是:如何临时锁定行,以防

我在MySql中有一个用户表

结构:

ID-大整数
Text-Varchar
验证=假(默认情况下)
Thread=默认情况下为false/当Thread处理当前行时设置为true

工作流

  • 按我们的情况划船
  • 将thread设置为true以防止其他线程使用它们
  • 变魔术
  • 设置验证为真
  • 将线程设置为false
  • 问题是当我有5个或更多线程时。在步骤2结束之前,另一个线程将获得相同的行。从90个线程中,多达40%的线程可以在同一行工作。在请求之前添加随机计时并没有太大帮助


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

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

    SELECT * FROM table WHERE id = 666 FOR UPDATE;
    
    因此,其他用户/线程无法读取您锁定的这些记录


    因为锁将在事务完成时自动释放。因此,您通常需要通过
    start transaction
    BEGIN
    启动事务,并将上述语句放入此事务中。

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

    SELECT * FROM table WHERE id = 666 FOR UPDATE;
    
    因此,其他用户/线程无法读取您锁定的这些记录


    因为锁将在事务完成时自动释放。因此,您通常需要通过
    start transaction
    BEGIN
    启动一个事务,并将上面的语句放在这个事务中。

    使用
    事务
    :不要从应用程序处理它,使用MySQL来处理它。。MySQL 5.5+和InnoDB引擎具有基于连接会话的行锁。。read()多线程并没有什么特别之处。数据库可以由任意数量的客户机并发访问—您需要担心的不仅仅是您自己应用程序的线程,还包括连接到数据库的所有其他客户机。像@Aaron建议的那样,事务允许您将一系列数据库操作捆绑到一个一致的原子操作中,包括在操作失败或需要撤销时使用回滚来彻底撤销操作的选项。此外,事务还应在select上使用FOR更新锁以防止死锁。因此select将在该行上设置写锁,防止其他线程锁定同一行;其他线程将等待在事务结束时解锁该行。使用
    事务
    :不要从应用程序处理该事务,请使用MySQL处理该事务。。MySQL 5.5+和InnoDB引擎具有基于连接会话的行锁。。read()多线程并没有什么特别之处。数据库可以由任意数量的客户机并发访问—您需要担心的不仅仅是您自己应用程序的线程,还包括连接到数据库的所有其他客户机。像@Aaron建议的那样,事务允许您将一系列数据库操作捆绑到一个一致的原子操作中,包括在操作失败或需要撤销时使用回滚来彻底撤销操作的选项。此外,事务还应在select上使用FOR更新锁以防止死锁。因此select将在该行上设置写锁,防止其他线程锁定同一行;其他线程将等待在事务结束时解锁该行。谢谢。这工作做得很好。但只有30个线程,在40个线程和更多线程上,由于完成其他操作,我得到了超时。我将全局读/写超时设置为9999,但没有帮助。很荣幸。谢谢。这工作做得很好。但只有30个线程,在40个线程和更多线程上,由于完成其他操作,我得到了超时。我将全局读/写超时设置为9999,但没有帮助。很高兴。