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相关推荐

  1. sqlite3.OperationalError: database is locked

    情景描述 windows上代码文件,设置为共享目录,mount到linux使用.运行python manage.py migrate,出现错误 报错 [root@localhost sqlalchem ...

  2. Azure SQL Database (23) Azure SQL Database Dynamic Data Masking动态数据掩码

    <Windows Azure Platform 系列文章目录> 我们在使用关系型数据的时候,有时候希望: - 管理员admin,可以查看到所有的数据 - 普通用户,某些敏感字段,比如信用卡 ...

  3. 解决 springboot 启动报错 -- Cannot determine embedded database driver class for database type NONE

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 问题描述 我只是新建一个全新的 springboot 工程,什么都没有写的情况下启动报错如题: ...

  4. 报错Cannot determine embedded database driver class for database type NONE解决方法

    由于我不需要数据库,启动springboot报错: Cannot determine embedded database driver class for database type NONE If ...

  5. 我眼中的Oracle Database Software 和 Oracle Database

    我眼中的Oracle Database Software 和 Oracle Database 我喜欢用微软的office软件和word文档(确切的说是:自己写的word文档,能够把这个Word文档想象 ...

  6. SpringBoot项目在启动时出现了Cannot determine embedded database driver class for database type NONE 错误

    问题描述:SpringBoot项目在启动时出现了以下错误无法启动 Cannot determine embedded database driver class for database type N ...

  7. 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 ...

  8. Cannot connect to the database. –Error connecting to database.

    环境 : Ubuntu 16 报错信息 : Cannot connect to the database. –Error connecting to database. 登录postgresql数据库 ...

  9. alter database recover managed standby database 语句

    RDBMS 11.2.0.4 参考文档: ALTER DATABASE (oracle.com) 语法格式如下: 一种用法: alter database recover managed standb ...

  10. SpringBoot  启动出现Cannot determine embedded database driver class for database type NONE

    刚创建的SpringBoot  启动出现Cannot determine embedded database driver class for database type NONE 实例化失败没有找到 ...

最新文章

  1. mysql 分组排序_Python、PowerBI、Excel、MySQL,都能做?搞清楚数据聚合与分箱
  2. 华为笔记本搭载鸿蒙系统,华为MatePad Pro2入网!预装鸿蒙系统 搭载麒麟9000
  3. Java-深拷贝与浅拷贝
  4. vs vue 查看webpack安装成功_在Vue+webpack中详细讲解基础配置
  5. 10193 条票房数据告诉你《流浪地球》领跑的电影档战果如何?
  6. 【NOIP2012】【Luogu1080】国王游戏(贪心,邻项交换)
  7. curl有时获取不到数据 什么原因导致_缓存击穿导致 golang 组件死锁的问题分享...
  8. SQL server 表数据改变触发发送邮件
  9. Fiddler2 抓包工具,让你的信息无处可藏
  10. 语义分割VOC2012标签处理
  11. PNP与NPN的转换电路
  12. 服务器sd卡装系统,sd卡如何重装系统操作教程
  13. edge浏览器添加新标签页问题
  14. PhotoShop,CSS 文字间距 与像素之间的换算
  15. Win10+Ubunut20.04双系统 双固态 宏基 暗影骑士擎 安装教程(步骤回忆)
  16. 我,单身沪漂,想有只猫
  17. POI抓取PPT图表页图表标题
  18. 镜头评价指标及测试方法【四】————手机摄像头调查
  19. [linux] bash_profile 编辑(i)/退出编辑(esc)/退出(:wq)
  20. Photoshop——APP设计规范

热门文章

  1. 根据已订房客人资料快速登记
  2. 摄影测量前方交会编程实现
  3. 服务器系统宽带拔号,宽带拨号上网什么意思?宽带拨号上网的操作步骤
  4. 2020.12.28用isprime函数判断m是否为素数
  5. 原创:AIR202连接阿里云调试纪实1
  6. 你知道PDF拆分合并怎么弄吗?两个方法帮你轻松搞定!
  7. java使用水晶报表,java处理水晶报表
  8. C语言求阶乘尾数零的个数
  9. 计算机无法安装cad怎么办,安装cad时电脑提示已经安装怎么办 cad无法安装的解决方法...
  10. 工业机器人实训耗材_工业机器人实训课程