我正在尝试使用Python提供的SQLite实现一个简单的计数器。我正在使用CGI编写简单的动态网页。这是我能想到的实现计数器的唯一简单方法。问题是我需要首先读取计数器值,然后更新它。但理想情况下,每个用户都应该读取一个唯一的值。如果两个用户同时读取,他们可能会读取相同的计数器值。有没有一种简单的方法可以使读/写操作原子化?我不熟悉SQL,所以请给予具体的语句来实现。提前感谢。我使用一个一列一行的表来存储计数器。
bpzcxfmw1#
您可以尝试以下SQL语句流:
BEGIN EXCLUSIVE TRANSACTION; // update counter here // retrieve new value for user COMMIT TRANSACTION;
当你在三部分中执行更新时,只有在连接上执行的时候才能看到更改。在这个例子中,我们使用了EXCLUSIVE事务,它为其他客户端锁定数据库,直到它提交事务。
ggazkfy82#
完整代码:
BEGIN EXCLUSIVE TRANSACTION; UPDATE table_name SET counter = COALESCE(counter, 0) + 1; COMMIT;
dgjrabp23#
最好不要在事务中使用EXCLUSIVE关键字以提高效率。第一个select语句自动创建一个共享锁,然后update语句将其转换为独占锁。只需要SELECT和UPDATE都在显式的set事务中即可。
BEGIN TRANSACTION; // read counter value // update counter value COMMIT TRANSACTION;
3条答案
按热度按时间bpzcxfmw1#
您可以尝试以下SQL语句流:
当你在三部分中执行更新时,只有在连接上执行的时候才能看到更改。在这个例子中,我们使用了EXCLUSIVE事务,它为其他客户端锁定数据库,直到它提交事务。
ggazkfy82#
完整代码:
dgjrabp23#
最好不要在事务中使用EXCLUSIVE关键字以提高效率。第一个select语句自动创建一个共享锁,然后update语句将其转换为独占锁。只需要SELECT和UPDATE都在显式的set事务中即可。