我通过Python sqlite3模块在python中使用SQLite。我在共享数据库上进行多处理,但不是多线程。
阅读sqlite3的文档,似乎应该通过Connection.isolation_level()来控制锁定。
然而,当我打开两个不同的python交互过程并执行语句(如下)时,我得到了相同的结果。这两个进程显然都是独占锁定的数据库。
哪些序列的Python语句会导致一个进程拥有锁,而另一个进程知道它已被拒绝?锁定进程如何知道它被锁定了? sqlite3会引发错误还是从Connection.isolation_level()返回错误?
$ python
Python 2.7.13 (default, Mar 31 2017, 11:27:49)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.connect('data/precinctTracker.db')
>>> conn
<sqlite3.Connection object at 0x1011a53d0>
>>> conn.isolation_level ='EXCLUSIVE'
>>> conn.isolation_level
'EXCLUSIVE'
>>>
答案 0 :(得分:0)
isolation_level
属性控制transaction behaviour,这对您的应用程序没有太大影响。
只有在实际访问数据库文件时,连接才会锁定。因此,要测试锁定,您必须执行一些SQL命令来读取或写入内容。
如果连接无法获取锁定,则会出现“数据库已锁定”错误。
大多数交易都很短(如果您忘记拨打commit()
),那么您可以通过设置busy timeout来阻止此操作。