DBD :: SQLite: вставка или обновление - вопрос - PullRequest
2 голосов
/ 11 мая 2011

Во время написания моего вопроса (как: вставить новую запись и, если она уже существует, обновить ее), я нашел несколько ответов в 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 );

Второй метод более безопасен, чем первый?

1 Ответ

4 голосов
/ 11 мая 2011

Второй метод менее безопасен, потому что он не атомарный. Другими словами, это происходит более чем за один шаг. Рассмотрим два процесса, которые обновляют одни и те же данные. Время движется вниз.

Process 1                      Process 2

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

Процесс 1 запускается первым, но процесс 2 включается и обновляется между ними. Затем процесс 1 переходит прямо к обновлению процесса 2.

Это не так уж плохо в данной конкретной ситуации, оба процесса будут навязываться друг другу, несмотря ни на что, но вы легко можете столкнуться с неприятностями, расширив свою технику.

(Если я неправильно понял вопрос, а вам нужен 1010 * upsert )

...