我在python中编写了很多并行脚本用于研究目的,并且想知道是否有可能在sqlite中为一组特定命令手动获取读/写锁。以下是我需要它的简单示例:
简单示例:
假设我有一个表( A ),我想简单地计算其中的行数并将结果并行存储在另一个表( B )中。为此,我运行了一个程序的10个实例来计算某个 A 范围内的行,并将行的总和添加到 B 中的属性。
问题是我需要读取B中的属性,将其添加到实例的计数中并保存;同时确保没有其他实例正在执行此过程。通常它只需要一个写锁 - 在这种情况下我也需要一个读锁...
我希望我能做到这样的事情:
有办法做到这一点吗?
感谢。
答案 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>