【问题标题】:Is Rollback necessary in this select for update (no rows returned)?此选择是否需要回滚以进行更新(不返回行)?
【发布时间】:2014-04-04 18:32:32
【问题描述】:
$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
回滚是否必要,因为它仅在由于没有返回行而没有锁定行时调用?在实际未选择任何内容的情况下,选择更新并且从不回滚或提交是否会浪费任何资源?
【问题讨论】:
标签:
php
mysql
pdo
rollback
【解决方案1】:
只有当您有一个打开的事务并且一个或多个表中的数据已被更改时,才需要回滚。 SELECT 语句本身不需要回滚。
【解决方案2】:
在 select for update 中,根据您使用将 autocommit 设置为 0 的 beginTransaction 的方式,选定的行会获得一个行锁(当然必须是 innodb,但我假设您知道这一点)。
要释放锁,您可以提交或回滚。
就我个人而言,我会为适合回滚的错误情况保留回滚,所以我不会回滚,而只是通过提交将整个内容放在 try -- catch 块中来结束块。那么你就不需要关心解锁机制或者是否选择了行。
try {
$stmt = $pdo->prepare("SELECT somedata FROM mytable FOR UPDATE");
$pdo->beginTransaction();
$stmt->execute();
while ($row = ....) {
}
commit;
catch( PDOException $Exception ) {
rollback;
}