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