在撰写我的问题时(如何:插入一个新条目,如果它已经存在,请更新它)我在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 );
第二种方法比第一种方法更安全吗?
答案 0 :(得分:4)
第二种方法是 less 安全,因为它是非原子的。换句话说,它发生在不止一个步骤中。考虑两个进程都更新相同的数据。时间渐渐过去了。
Process 1 Process 2
INSERT OR IGNORE...
INSERT OR IGNORE...
UPDATE...
UPDATE...
进程1首先启动,但进程2潜入并在其间进行更新。然后,流程1对流程2的更新进行了深入研究。
在这种特殊情况下,情况并非如此糟糕,无论如何,这两个过程都会相互冲击,但你可以通过扩展技术轻松地让自己陷入困境。
(除非我误解了这个问题,你想要的是upsert)