sqlite 原子地读取和更新计数器?

lokaqttq  于 2023-03-03  发布在  SQLite
关注(0)|答案(3)|浏览(169)

我正在尝试使用Python提供的SQLite实现一个简单的计数器。我正在使用CGI编写简单的动态网页。这是我能想到的实现计数器的唯一简单方法。问题是我需要首先读取计数器值,然后更新它。但理想情况下,每个用户都应该读取一个唯一的值。如果两个用户同时读取,他们可能会读取相同的计数器值。有没有一种简单的方法可以使读/写操作原子化?我不熟悉SQL,所以请给予具体的语句来实现。提前感谢。
我使用一个一列一行的表来存储计数器。

bpzcxfmw

bpzcxfmw1#

您可以尝试以下SQL语句流:

BEGIN EXCLUSIVE TRANSACTION;
// update counter here
// retrieve new value for user
COMMIT TRANSACTION;

当你在三部分中执行更新时,只有在连接上执行的时候才能看到更改。在这个例子中,我们使用了EXCLUSIVE事务,它为其他客户端锁定数据库,直到它提交事务。

ggazkfy8

ggazkfy82#

完整代码:

BEGIN EXCLUSIVE TRANSACTION;
UPDATE table_name SET counter = COALESCE(counter, 0) + 1;
COMMIT;
dgjrabp2

dgjrabp23#

最好不要在事务中使用EXCLUSIVE关键字以提高效率。第一个select语句自动创建一个共享锁,然后update语句将其转换为独占锁。只需要SELECT和UPDATE都在显式的set事务中即可。

BEGIN TRANSACTION;
// read counter value
// update counter value
COMMIT TRANSACTION;

相关问题