2

在写我的问题时(如何:插入一个新条目,如果它已经存在,请更新它)我在以下位置找到了一些答案Related Questions

$sql = "INSERT OR REPLACE INTO $table ( Id, Name, Rating ) VALUES( ?, ?, ? )";
$sth_rating = $dbh->prepare( $sql );
$sth_rating->execute( $id, $name, $rating );

.

$sql = "INSERT OR IGNORE INTO $table ( Id, Name, Rating ) VALUES ( ?, ?, ? )";
$sth_rating = $dbh->prepare( $sql );
$sth_rating->execute( $id, $name, $rating );

$sql = "UPDATE $table SET Rating = ? WHERE Id = ?";
$sth_rating = $dbh->prepare( $sql );
$sth_rating->execute( $rating, $id );

第二种方法比第一种方法更安全吗?

4

1 回答 1

4

第二种方法不太安全,因为它是非原子的。换句话说,它发生在不止一个步骤中。考虑两个进程都更新相同的数据。时间在往下走。

Process 1                      Process 2

INSERT OR IGNORE...
                               INSERT OR IGNORE...
                               UPDATE...
UPDATE...

进程 1 首先启动,但进程 2 潜入并在其间进行更新。然后进程 1 直接忽略进程 2 的更新。

在这种特殊情况下,这并不是那么糟糕,无论如何,这两个过程都会相互影响,但是通过扩展您的技术,您很容易陷入困境。

(除非我误解了这个问题,而你想要的是一个upsert

于 2011-05-11T07:17:24.640 回答