$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,因为只有在由于没有返回行而没有锁定行时才调用它?在实际上没有选择任何行的情况下,选择更新而从不回滚或提交是否会浪费资源?
3条答案
按热度按时间kyvafyod1#
在select for update中,根据您使用beginTransaction(将autocommit设置为0)的方式,所选的行将获得一个行锁(当然必须是innodb,但我假设您知道这一点)。
要释放锁,可以提交或回滚。
就我个人而言,我会在需要回滚的错误情况下保留回滚,所以我不会回滚,而只是用一个提交结束块,整个块都在try -- catch块中,这样就不需要关心解锁机制或是否有行被选中。
6ju8rftf2#
只有当您有一个打开的事务并且一个或多个表中的数据已被更改时,才需要回退。
SELECT
语句本身不需要回退。jm81lzqq3#
根据documentation-是的。因为你需要一个事务来执行这样的锁。
但是,如果您刚刚断开连接,则不需要显式回滚