我有一个相当大的python3应用程序(20.000行),它大量使用SQLite数据库.它有一个Web-UI和API,这使得它有10个用于Web服务器的线程和2-3个其他线程.所有这些线程都可以写入数据库,因此可能存在一定的并发性.每个线程有一个数据库连接.

我的应用程序自启动以来一直存在的问题是,数据库有时会锁定(‘数据库已锁定’错误).据我所知,当两个连接想要写入数据库,但其中一个连接在另一个连接超时(等待写入)超时之前尚未提交其更改时,就会发生这种情况.

我注意到的奇怪之处是,有时我在应用程序启动后几秒钟内就会收到错误.我将我的超时设置为20秒(sqlite3.connect('database.db', timeout=20.0)),但我会在应用程序启动大约2秒后收到错误.这怎么会发生呢?The documentation规定超时参数决定连接在放弃锁之前应该等待多长时间.那么,当我将值设置为20秒时,它怎么能在2秒后放弃呢?

推荐答案

我仍然不明白为什么您try 设置20秒繁忙超时(无论是使用timeout参数还是使用SQL PRAGMA busy_timeout语句)都不起作用.但我们在 comments 中的讨论找到了一个变通办法:

sqlite3.connect有一个可选的isolation_level参数,它控制事务期间的数据库锁定行为.

  • DEFERRED(默认)模式中,事务在开始时获取对数据库的读锁定,并仅在请求写操作时获取写锁定.
  • IMMEDIATE模式下,事务立即获取写锁定,即使它只执行读操作.try 写入数据库的其他事务将被阻止,但只读事务仍可继续.
  • EXCLUSIVE模式下,事务获取数据库的独占锁,阻塞所有其他事务,读or写操作,直到提交或回滚当前事务.

使用EXCLUSIVE模式似乎已经解决了您当前的问题.

Python相关问答推荐

为什么基于条件的过滤会导致pandas中的空数据框架?

有什么方法可以避免使用许多if陈述

从包含数字和单词的文件中读取和获取数据集

使用scipy. optimate.least_squares()用可变数量的参数匹配两条曲线

列表上值总和最多为K(以O(log n))的最大元素数

'discord.ext. commanders.cog没有属性监听器'

根据二元组列表在pandas中创建新列

Python虚拟环境的轻量级使用

使用setuptools pyproject.toml和自定义目录树构建PyPi包

Python,Fitting into a System of Equations

当独立的网络调用不应该互相阻塞时,'

计算每个IP的平均值

如何在UserSerializer中添加显式字段?

Python Pandas获取层次路径直到顶层管理

使用特定值作为引用替换数据框行上的值

在代码执行后关闭ChromeDriver窗口

有没有办法让Re.Sub报告它所做的每一次替换?

python的文件. truncate()意外地没有截断'

Django在一个不是ForeignKey的字段上加入'

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?