Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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
Php Mysql锁定行的并发读取/更新_Php_Mysql_Concurrency_Innodb - Fatal编程技术网

Php Mysql锁定行的并发读取/更新

Php Mysql锁定行的并发读取/更新,php,mysql,concurrency,innodb,Php,Mysql,Concurrency,Innodb,我有一个表,有很多(太多)请求从中选择一行。选择一行后,脚本运行updatequery以设置一个标志,即该行已被“选中”。但是由于我们每次有太多的请求,在一个线程选择一行并更新其标志的时间间隔内,另一个线程有时间选择同一行 选择查询从表中获取一行,按某个字段对其排序,并使用限制0,1。我需要DB跳过之前选择的行 引擎是InnoDB。在启动事务之前,调用以下命令: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 这将确保,如果您读取带有标志的行,那

我有一个表,有很多(太多)请求从中选择一行。选择一行后,脚本运行updatequery以设置一个标志,即该行已被“选中”。但是由于我们每次有太多的请求,在一个线程选择一行并更新其标志的时间间隔内,另一个线程有时间选择同一行

选择查询从表中获取一行,按某个字段对其排序,并使用限制0,1。我需要DB跳过之前选择的行


引擎是InnoDB。

在启动事务之前,调用以下命令:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
这将确保,如果您读取带有标志的行,那么在同一事务中更新该行时,该行仍然是这样

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;

SELECT id_site
INTO @site
FROM table1 WHERE flag = 0 ORDER BY field LIMIT 0,1;

UPDATE table1 SET flag = 1 WHERE id_site = @site;

COMMIT;

我已经从表1中选择了id\u site,name,其中flag=0,ORDER BY field LIMIT 0,1,然后更新了表1 SET flag=1,其中id\u site=:id\u site,第二个查询使用了前面查询中的id\u site值。如何在一个事务中做到这一点?我有一个这样的代码,但我有一个错误SQLSTATE[HY000]:General error我建议将这样的代码块放入存储过程中