在我的PHP代码中,我试图使innoDB数据库事务被忽略,如果另一个线程已经在行上执行事务。下面是一些示例代码:
$db = connect_db();
try{
$db->beginTransaction();
$query = "SELECT val FROM numbers WHERE id=1 FOR UPDATE"; //I want this to throw an exception if row is already selected for update
make_query($db,$query); //function I use to make queries with PDO
sleep(5); //Added to delay the transaction
$num = rand(1,100);
$query = "UPDATE numbers SET val='$num' WHERE id=1";
make_query($db,$query);
$db->commit();
echo $num;
}
catch (PDOException $e){
echo $e;
}
当它使SELECT val FROM numbers WHERE id=1 FOR UPDATE
查询时,我需要通过php知道线程是否正在等待另一个线程完成它的事务并释放锁。最终发生的情况是,第一个线程完成事务,第二个线程随后立即覆盖其更改。相反,我希望第一个事务完成,第二个事务回滚或提交,而不做任何更改。
考虑使用GET_LOCK()
模拟记录锁
选择与要锁定的行相关的名称。如。"numbers_1"。
调用SELECT GET_LOCK('numbers_1',0)
锁定名称numbers_1 ..如果名称可用,则返回1并设置锁,如果已经设置了锁,则返回0。第二个参数是超时,0表示立即。如果返回0,则可以退出。
完成后使用SELECT RELEASE_LOCK('numbers_1')
注意;在事务中再次调用GET_LOCK()
将释放先前设置的锁。