$stmt = $pdo->prepare("SELECT somedata FROM mytable FOR UPDATE");
$pdo->beginTransaction();
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ( $row == FALSE ) {
$pdo->rollBack();
} else {
....run some code and then commit
rollBack是否必要,因为只有在因没有返回行而没有锁定行时才会调用它?通过选择更新来浪费任何资源,并且在没有实际选择任何内容的情况下永不回滚或提交?
答案 0 :(得分:1)
只有在打开事务并且一个或多个表中的数据已被更改时,才需要回滚。 SELECT
语句本身不需要回滚。
答案 1 :(得分:1)
在select for update中,选择的行获取一个rowlock(当然必须是innodb,但我假设你知道这一点),这取决于你使用beginTransaction的方式,它将autocommit设置为0。
要释放锁,您可以提交或回滚。
就个人而言,我会保留回滚以适应回滚的错误条件,因此我不会回滚,只是在try-catch块中使用整个事件提交结束块。然后,您不必担心解锁机制或是否选择了行。
try {
$stmt = $pdo->prepare("SELECT somedata FROM mytable FOR UPDATE");
$pdo->beginTransaction();
$stmt->execute();
while ($row = ....) {
}
commit;
catch( PDOException $Exception ) {
rollback;
}
答案 2 :(得分:0)
根据documentation - 是的。因为您需要一个事务来执行这样的锁定。
但是,如果您很快断开连接,则不需要显式回滚