python database is locked_sqlite3.OperationalError: database is locked
python标准库自带sqlite3接口,在编译安装的时候,sqlite3也会一起编译。sqlite3是一个轻量自包含的文件数据库,没有独立的管理进程,因此,在基于此数据库编写应用系统的时候,并发访问就成了一个需要自己处理的问题。
因为sqlite3是文件,一个进程在写入的时候,另一个进程就无法写入!而进程间的同步,需要我们自己处理。多线程也一样,python sqlite3模块默认不允许在线程间共享 connect 对象。
多线程序列化访问比较好处理,多进程可能就需要代码自己处理 database is locked 这个异常了!
下面这段测试代码,能够跑出 database is locked 异常,以此证明本文主题的存在:
$ cat test_sqlite3.py
import multiprocessing as mp
import sqlite3
def write():
conn = sqlite3.connect('tdb')
conn.isolation_level = None
c = conn.cursor()
for i in range(1000):
c.execute("INSERT INTO mod2 VALUES (1,2,3)")
phlist = [mp.Process(target=write, args=(), daemon=True) for i in range(3)]
for ph in phlist:
ph.start()
for ph in phlist:
ph.join()
print('done')
运行时,有两个process会抛出异常:
$ python3 test_sqlite3.py
Process Process-2:
Traceback (most recent call last):
File "/usr/local/python3.8.6/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/usr/local/python3.8.6/lib/python3.8/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "test_sqlite3.py", line 16, in write
c.execute("INSERT INTO mod2 VALUES (1,2,3)")
sqlite3.OperationalError: database is locked
Process Process-3:
Traceback (most recent call last):
File "/usr/local/python3.8.6/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/usr/local/python3.8.6/lib/python3.8/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "test_sqlite3.py", line 16, in write
c.execute("INSERT INTO mod2 VALUES (1,2,3)")
sqlite3.OperationalError: database is locked
当看到此异常时,在sqlite3的shell中做select,也是一样的异常:
sqlite> select count(*) from mod2;
Error: database is locked
sqlite> select count(*) from mod2;
Error: database is locked
有一行代码很有趣:
conn.isolation_level = None
默认情况下,都需要调用commit函数才能真正写入数据库,而 isolation_level=None 后,对应的就是 sqlite3 的autocommit模式,也就不需要再调用commit函数了。
autocommit 顾名思义,就是每一次修改都有效,都默认支持了一次commit操作。因此 autocommit 模式下 insert 速度特别地慢!!一般别这样用。
-- EOF --
python database is locked_sqlite3.OperationalError: database is locked相关推荐
- sqlite3.OperationalError: database is locked
情景描述 windows上代码文件,设置为共享目录,mount到linux使用.运行python manage.py migrate,出现错误 报错 [root@localhost sqlalchem ...
- Azure SQL Database (23) Azure SQL Database Dynamic Data Masking动态数据掩码
<Windows Azure Platform 系列文章目录> 我们在使用关系型数据的时候,有时候希望: - 管理员admin,可以查看到所有的数据 - 普通用户,某些敏感字段,比如信用卡 ...
- 解决 springboot 启动报错 -- Cannot determine embedded database driver class for database type NONE
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 问题描述 我只是新建一个全新的 springboot 工程,什么都没有写的情况下启动报错如题: ...
- 报错Cannot determine embedded database driver class for database type NONE解决方法
由于我不需要数据库,启动springboot报错: Cannot determine embedded database driver class for database type NONE If ...
- 我眼中的Oracle Database Software 和 Oracle Database
我眼中的Oracle Database Software 和 Oracle Database 我喜欢用微软的office软件和word文档(确切的说是:自己写的word文档,能够把这个Word文档想象 ...
- SpringBoot项目在启动时出现了Cannot determine embedded database driver class for database type NONE 错误
问题描述:SpringBoot项目在启动时出现了以下错误无法启动 Cannot determine embedded database driver class for database type N ...
- SpringBoot项目报错Cannot determine embedded database driver class for database type NONE
原因: Cannot determine embedded database driver class for database type NONE 这是因为spring boot默认会加载org.s ...
- Cannot connect to the database. –Error connecting to database.
环境 : Ubuntu 16 报错信息 : Cannot connect to the database. –Error connecting to database. 登录postgresql数据库 ...
- alter database recover managed standby database 语句
RDBMS 11.2.0.4 参考文档: ALTER DATABASE (oracle.com) 语法格式如下: 一种用法: alter database recover managed standb ...
- SpringBoot 启动出现Cannot determine embedded database driver class for database type NONE
刚创建的SpringBoot 启动出现Cannot determine embedded database driver class for database type NONE 实例化失败没有找到 ...
最新文章
- mysql 分组排序_Python、PowerBI、Excel、MySQL,都能做?搞清楚数据聚合与分箱
- 华为笔记本搭载鸿蒙系统,华为MatePad Pro2入网!预装鸿蒙系统 搭载麒麟9000
- Java-深拷贝与浅拷贝
- vs vue 查看webpack安装成功_在Vue+webpack中详细讲解基础配置
- 10193 条票房数据告诉你《流浪地球》领跑的电影档战果如何?
- 【NOIP2012】【Luogu1080】国王游戏(贪心,邻项交换)
- curl有时获取不到数据 什么原因导致_缓存击穿导致 golang 组件死锁的问题分享...
- SQL server 表数据改变触发发送邮件
- Fiddler2 抓包工具,让你的信息无处可藏
- 语义分割VOC2012标签处理
- PNP与NPN的转换电路
- 服务器sd卡装系统,sd卡如何重装系统操作教程
- edge浏览器添加新标签页问题
- PhotoShop,CSS 文字间距 与像素之间的换算
- Win10+Ubunut20.04双系统 双固态 宏基 暗影骑士擎 安装教程(步骤回忆)
- 我,单身沪漂,想有只猫
- POI抓取PPT图表页图表标题
- 镜头评价指标及测试方法【四】————手机摄像头调查
- [linux] bash_profile 编辑(i)/退出编辑(esc)/退出(:wq)
- Photoshop——APP设计规范