前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[743]python sqlite3.ProgrammingError: SQLite objects created in a thread can only be used

[743]python sqlite3.ProgrammingError: SQLite objects created in a thread can only be used

作者头像
周小董
发布2020-01-13 17:44:00
1.7K0
发布2020-01-13 17:44:00
举报
文章被收录于专栏:python前行者python前行者
错误

sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 12096 and this is thread id 19564

引言: SQLite是基于文件系统的mini数据库,我们用以存放简便的数据,本文将描述在代码中碰到的并发问题。

代码为多个线程进行数据库的读写操作。这里简要列出关键的数据库操作,主要集中在insert/update操作。

问题分析

从错误信息来分析,问题是sqlite本身应对多个线程并发访问过程中的冲突问题,由一个线程创建并访问的sqlite的数据库,无法允许另外一个线程进行访问。这里的解决办法可能有2个:

  • 通过队列规避多线程的访问
  • 通过设置或者多个访问管道,规避线程之间的冲突问题

从技术上评估,2个方法都可以解决问题,哪种更具优势?

问题解决

通过网上搜索发现,其实可以通过设置sqlite文件的读取方式,可以简单规避掉线程之间的冲突问题:

代码语言:javascript
复制
def initDB(self, file_path):
        self.file_path = file_path
        self.cx = sqlite3.connect(file_path, check_same_thread=False)
        self.cx.execute(self.create_table_str)
        self.cx.execute(self.create_detail_table_str)
        print("init the table strucutre successfully")

check_same_thread这个设置为False,即可允许sqlite被多个线程同时访问

总结

对于sqlite而言,所有的读取或者打开操作,都是有check_same_thread的设置,与语言无关。


SQLite库级锁简介和“database is locked”异常

SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite允许多个进程/线程同时进行读操作,但在同一时刻只允许一个线程进行写操作。SQLite在进行写操作时,数据库文件会被锁定,此时任何其他的读/写操作都会被阻塞,如果阻塞超过5秒钟(默认是5秒,可通过重新编译SQLite进行修改),就会抛出描述为“database is locked”的异常。

出现上述现象的原因是SQLite只支持库级锁,不支持并发执行写操作,即使是不同的表,同一时刻也只能进行一个写操作。例如,事务T1在表A新插入一条数据,事务T2在表B中更新一条已存在的数据,这两个操作是不能同时进行的,只能顺序进行。

SQLite尽量延迟了申请X锁,直到数据块真正写盘时才申请X锁,再加上被阻塞的操作有等待时间,所以当SQLite作为客户端嵌入数据库被使用时时,一般情况下不会抛出“database is locked”的异常。但是,在高并发的环境下,还是很有可能抛出异常的。避免这种异常的最简单有效的方法,就是在进行写操作时实现互斥锁,并保证写操作按顺序执行。

参考:https://blog.csdn.net/blueheart20/article/details/70218102 https://blog.csdn.net/WZh0316/article/details/81188451

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 错误
  • 问题分析
  • 问题解决
  • 总结
  • SQLite库级锁简介和“database is locked”异常
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档