【发布时间】:2014-10-29 16:50:47
【问题描述】:
我看过许多解释 Select FOR UPDATE 的用法以及如何锁定行的帖子,但是我找不到任何解释代码尝试读取锁定的行时会发生什么的帖子。
例如。假设我使用以下内容:
$con->autocommit(FALSE);
$ps = $con->prepare( "SELECT 1 FROM event WHERE row_id = 100 FOR UPDATE");
$ps->execute();
...
//do something if lock successful
...
$mysqli->commit();
在这种情况下,如何确定我的锁定是否成功?当行已被锁定时,处理方案的最佳方法是什么?
很抱歉,如果这在某处有所描述,但我似乎只能找到“快乐之路”的解释。
【问题讨论】:
-
通常 SELECT 是非锁定的,因为它们是非事务性的读取操作。
-
如果它被锁定以供阅读,它会等待。并等待。 (取决于您的
SESSION TRANSACTION ISOLATION LEVEL)。但通常你会看到“陈旧”的数据(即:尚未提交的事务中还没有数据,因此“陈旧”是有争议的),而不是在读取时遇到行锁定。 -
它还取决于表类型。我假设这是
InnoDB? -
是的,数据库是 InnoDB
-
所以你在说@Wrikken - 我的代码应该假设成功锁定并继续执行逻辑 - 以便并发事务看起来类似于之前完成的事务。基本上,如果事务 1 锁定并在事务 2 尝试读取时进行更改,那么事务 2 会以与事务 1 非并发发生但在 T2 的读取时间之前发生的方式相同。
标签: php mysql mysqli innodb rowlocking