perl - DBD::SQLite:插入或更新 - 问题

标签 perl sqlite dbi sql-update sql-insert

在编写我的问题时(如何:插入一个新条目,如果它已经存在,则更新它),我在相关问题中找到了一些答案:

$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 );

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

最佳答案

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

Process 1                      Process 2

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

进程 1 首先启动,但进程 2 潜入并在其间进行更新。然后进程 1 就会跳过进程 2 的更新。

在这种特殊情况下,这还不算太糟糕,无论如何,两个过程都会相互冲突,但扩展你的技术很容易给自己带来麻烦。

(除非我误解了这个问题并且你想要的是 upsert )

关于perl - DBD::SQLite:插入或更新 - 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5960456/

相关文章:

perl - 是否有 Perl GUI 构建器,尤其是 WxPerl?

arrays - 在 Perl 数组中保存命令行选项的多个值

perl - 有没有什么方法可以在没有计划的情况下使用 Test::More 中的 diag() ?

android - 如何将解析的 JSON 保存到 SQLite Android

sql-server - 在 PERL 中从 Windows 访问 Microsoft SQL Server

mysql - Perl 模块 : MySQL vs DBI

perl - 每个人的意外行为

c# - 如何使用 SQLite-Net 扩展建立 A -> B -> C 关系

android - 数据库结构-药物使用

mysql - DBD::Mysql和ODBC有什么关系?