获取Sqlite并行更新的读/写锁

时间:2011-04-04 23:40:46

标签: sqlite parallel-processing

我在python中编写了很多并行脚本用于研究目的,并且想知道是否有可能在sqlite中为一组特定命令手动获取读/写锁。以下是我需要它的简单示例:

简单示例:
假设我有一个表( A ),我想简单地计算其中的行数并将结果并行存储在另一个表( B )中。为此,我运行了一个程序的10个实例来计算某个 A 范围内的行,并将行的总和添加到 B 中的属性。

问题是我需要读取B中的属性,将其添加到实例的计数中并保存;同时确保没有其他实例正在执行此过程。通常它只需要一个写锁 - 在这种情况下我也需要一个读锁...

我希望我能做到这样的事情:

  1. 读/写锁
  2. 抓取 B 中的当前值,将其添加到 实例计数
  3. 保存新值
  4. 解锁
  5. 有办法做到这一点吗?

    感谢。

1 个答案:

答案 0 :(得分:3)

您可以使用单个UPDATE语句递增整数值:

sqlite> CREATE TABLE B(Id INTEGER, Value INTEGER);
sqlite> INSERT INTO B VALUES(0, 15);
sqlite> UPDATE B SET Value=Value + 23 WHERE Id = 0;
sqlite> SELECT * FROM B;
0|38
sqlite> 

使用单个UPDATE语句使此操作成为原子,不需要额外的锁定。

如果您需要更复杂的处理,可以使用SQL transactions来确保以原子方式执行任何复杂的数据库操作。

一般来说,你应该避免在SQLite外部进行任何锁定或者搞乱SQLite锁定子系统 - 这样做是一个非常好的死锁方法......

编辑:

要附加到字符串,您可以使用||连接运算符:

sqlite> CREATE TABLE C(Id INTEGER, Value TEXT);
sqlite> INSERT INTO C VALUES(0, 'X');
sqlite> UPDATE C SET Value=Value || 'Y' WHERE Id = 0;
sqlite> SELECT * FROM C;
0|XY
sqlite>