如何使用Python设置SQLite隔离级别

时间:2015-11-30 14:25:25

标签: python sqlite transactions

我知道(至少,我认为我知道),在标准中,处理交易时有四个隔离级别:

READ UNCOMMITTED - will allow everything
READ COMMITTED - will not allow dirty reads 
REPEATABLE READ - will not allow dirty, non-repearable reads   
SERIALIZABLE - will not allow dirty, non-repearable, phantom reads

我知道这一点,例如,在处理MySQL时,我可以做类似的事情:

cursor = db.cursor()
cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")

或者,如果我正在处理Postgre,我可以做类似的事情:

db.set_isolation_level(3) # corresponds to SERIALIZABLE

所以,我想,如果我在处理SQLite时可以做类似的事情。我只见过:

db.isolation_level = None

但我不确定它的含义以及如何设置其他隔离级别(如果它们存在于SQLite的上下文中)。谢谢!

2 个答案:

答案 0 :(得分:4)

sqlite中有PRAGMA statements。看来你可以这样做:

db.execute("PRAGMA read_uncommitted = true;");

答案 1 :(得分:1)

扩展马丁的答案......

SQLite中的所有事务都是SERIALIZABLE,因为SQLite通过数据库范围的读写锁控制并发,因此一次只能有一个编写器。

例外情况是,如果您在同一进程中的两个或多个连接之间设置了shared cache mode并启用了the read_uncommited pragma,那么这些连接可以在READ UNCOMMITED模式下运行(但是共享缓存之外的连接会像往常一样阻止它们。)