我正在尝试使用Python提供的SQLite来实现一个简单的计数器。我正在使用CGI编写简单的动态网页。这是我能想到实现计数器的唯一简单方法。问题是我需要先读取计数器值然后更新它。但理想情况下,每个用户都应该读取一个唯一值,并且如果两个用户同时读取,则两个用户可以读取相同的计数器值。有一种简单的方法可以使读/写操作成为原子吗?我不熟悉SQL,所以请给出具体的陈述。提前谢谢。
我使用一个包含一列和一行的表来存储计数器。
答案 0 :(得分:5)
您可以尝试以下SQL语句流程:
BEGIN EXCLUSIVE TRANSACTION;
// update counter here
// retrieve new value for user
COMMIT TRANSACTION;
在三分法中执行更新时,只能通过连接执行更改。在这种情况下,我们使用 EXCLUSIVE 事务,这会锁定其他客户端的数据库,直到它将提交事务。
答案 1 :(得分:1)
最好不要在事务中使用EXCLUSIVE关键字来提高效率。第一个select会自动创建一个共享锁,然后update语句会将其变为独占锁。只需要SELECT和UPDATE都在显式集合事务中。
BEGIN TRANSACTION;
// read counter value
// update counter value
COMMIT TRANSACTION;