返回顶部
首页 > 资讯 > 后端开发 > Python >sqlite3 多线程问题..
  • 456
分享到

sqlite3 多线程问题..

多线程 2023-01-31 06:01:44 456人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这几天在做 学生考试系统,其中需要存储数据时要并发,然而我采用的sqlite3,小型数据库,导致了很多问题,特别是在多进程访问写的时候,特此分享给大家; 明天看看,利用C去调用Mysql,听说mysql在并发性这方面做得挺好! ======

这几天在做 学生考试系统,其中需要存储数据时要并发,然而我采用的sqlite3,小型数据库,导致了很多问题,特别是在多进程访问写的时候,特此分享给大家;

明天看看,利用C去调用Mysql,听说mysql在并发性这方面做得挺好!

====================================================================================

1多个应用程序或者同一个应用程序的多个例程能同时存取同一个数据库文件吗?


多进程可以同时打开同一个数据库,也可以同时 SELECT 。但只有一个进程可以立即改数据库。
SQLite使用读/写定来控制数据库访问。(Win95/98/ME 操作系统缺乏读/写锁定支持,在低于 2.7.0 的版本中,这意味着在 windows 下在同一时间内只能有一个进程读数据库。在版本 2.7.0 中 这个问题通过在 windows 接口代码中执行一个用户间隔几率读写锁定策略解决了。) 但如果数据库文件在一个 NFS 文件系统中,控制并发读书的锁定机制可以会出错。因为 NFS 的fcntl() 文件锁定有时会出问题。如果有多进程可能并发读数据库则因当避免把数据库文件放在 NFS 文件系统中。 根据微软的文档,如果不运行 Share.exe 后台程序则 FAT 文件系统中的锁定可能不工作。对 Windows 非常有经验的人告诉我网络文件的锁定有许多问题并且不可靠。如果是这样,在2个或以上 Windows 系统中共享一个 SQLite 数据库文件会导致不可预知的问题。

我们知道没有其他的嵌入式 SQL数据库引擎比SQLite支持更多的并发性。 SQLite允许多进程 同时打开和读取数据库。任何一个进程需要写入时,整个数据库将在这一过程中被锁定。但这一般仅耗时 几毫秒。其他进程只需等待然后继续其他事务。其他嵌入式SQL数据库引擎往往只允许单进程访问数据库。

但是,client/server型的数据库引擎 (如 postgresql, MySQL, 以及 oracle) 通常支持更高的并发度, 并支持多进程同时写入同一个数据库。由于总有一个控制良好的服务器协调数据库的访问,这才保证了以上 特性的实现。如果你的应用需要很高的并发度,你应该考虑使用client/server数据库。事实上,经验告诉 我们大多数应用所需要的并发度比他们的设计者们想象的要少得多。

当 SQLite 尝试操作一个被另一个进程锁定的文件时,缺省的行为是返回 SQLITE_BUSY。你可以用 C代码更改这一行为。 使用 sqlite3_busy_handler() 或sqlite3_busy_timeout() api函数。

如果两个或更多进程同时打开同一个数据库,其中一个进程创建了新的表或索引,则其它进程可能不能立即看见新的表。其它进程可能需要关闭并重新连结数据库。


--------------------------------------------------------------------------------

2SQLite是线程安全的吗?

有时候是的。为了线程安全,SQLite 必须在编译时把 THREADSAFE 预处理宏设为1。在缺省的发行的已编译版本中 Windows 版的是线程安全的,而 linux 版的不是。如果要求线程安全,Linux 版的要重新编译。

“线程安全”是指二个或三个线程可以同时调用独立的不同的sqlite3_open() 返回的"sqlite3"结构。而不是在多线程中同时使用同一个 sqlite3 结构指针。

一个sqlite3结构只能在调用 sqlite3_open创建它的那个进程中使用。你不能在一个线程中打开一个数据库然后把指针传递给另一个线程使用。这是因为大多数多线程系统的限制(或 Bugs?)例如RedHat9上。在这些有问题的系统上,一个 线程创建的fcntl()锁不能由另一个线程删除或修改。由于SQLite依赖fcntl()锁来进行并发控制,当在线程间传递数据库连接时会出现严重的问题。

也许在Linux下有办法解决fcntl()锁的问题,但那十分复杂并且对于正确性的测试将是极度困难的。因此,SQLite目前不允许在线程间共享句柄。

在UNIX下,你不能通过一个 fork() 系统调用把一个打开的 SQLite 数据库放入子过程中,否则会出错。

 

在多线程情况下,一个sqlite3句柄不能共享给多个线程使用

 

--结束END--

本文标题: sqlite3 多线程问题..

本文链接: https://lsjlt.com/news/189782.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • sqlite3 多线程问题..
    这几天在做 学生考试系统,其中需要存储数据时要并发,然而我采用的sqlite3,小型数据库,导致了很多问题,特别是在多进程访问写的时候,特此分享给大家; 明天看看,利用C去调用mysql,听说mysql在并发性这方面做得挺好! ======...
    99+
    2023-01-31
    多线程
  • Android SQLite3多线程操作问题研究总结
    最近做项目时在多线程读写数据库时抛出了异常,这自然是我对SQlite3有理解不到位的地方,所以事后仔细探究了一番。 1.关于getWriteableDataBase()和get...
    99+
    2022-06-06
    sqlite3 多线程 SQLite 线程 Android
  • Java多线程之线程安全问题
    文章目录 一. 线程安全概述1. 什么是线程安全问题2. 一个存在线程安全问题的程序 二. 线程不安全的原因和线程加锁1. 案例分析2. 线程加锁2.1 理解加锁2.2 synchroni...
    99+
    2023-09-21
    java 线程安全 多线程 synchronized jvm
  • Android中的多线程问题
    目录一:问题的提出二:使用Handler处理多线程问题三:使用AsyncTask(异步任务)处理多线程问题 一:问题的提出 Android用户界...
    99+
    2022-06-06
    多线程 线程 Android
  • 多线程的死锁问题
    可重入和不可重入😊😊😊 一个线程针对同一个对象,连续加锁两次,是否会有问题 ~~ 如果没问题,就叫可重入的.如果有问题,就叫不可重入的. 代码示例&#...
    99+
    2023-10-02
    python 开发语言 java-ee 程序人生 学习 java
  • Java多线程之线程安全问题详解
    目录1. 什么是线程安全和线程不安全?2. 自增运算为什么不是线程安全的?3. 临界区资源和竞态条件总结:面试题: 什么是线程安全和线程不安全?自增运算是不是线程安全的?如何保证多线...
    99+
    2024-04-02
  • Java多线程之线程安全问题详情
    目录1.线程安全概述1.1什么是线程安全问题1.2一个存在线程安全问题的程序2.线程加锁与线程不安全的原因2.1案例分析2.2线程加锁2.2.1什么是加锁2.2.2如何加锁2.2.3...
    99+
    2024-04-02
  • sqlite3设置外键问题
    在做项目时用到了SQLITE3,要删除记录下相关联的消息和信号。我设置了外键。在工具的查询栏删除记录时相关的消息和信号都删了,但是vs2010 的sql语句就删不了。解决:在删除记录的sql语句前加上这句话:PRAGMA foreign——...
    99+
    2023-01-31
  • Java多线程之线程安全问题怎么解决
    本篇内容主要讲解“Java多线程之线程安全问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程之线程安全问题怎么解决”吧!1.线程安全概述1.1什么是线程安全问题首先我们需要...
    99+
    2023-06-30
  • Java多线程 - 线程安全和线程同步解决线程安全问题
    文章目录 线程安全问题线程同步方式一: 同步代码块方式二: 同步方法方式三: Lock锁 线程安全问题 线程安全问题指的是: 多个线程同时操作同一个共享资源的时候可能会出现业务安全问题,称为线程安全问题。 举例:...
    99+
    2023-08-20
    java 安全 jvm
  • C++多线程编程之如何解决多线程数据共享问题
    这篇文章主要讲解了“C++多线程编程之如何解决多线程数据共享问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++多线程编程之如何解决多线程数据共享问题”吧!通过容器创建多个线程#incl...
    99+
    2023-06-15
  • Java多线程中线程安全问题的示例分析
    这篇文章主要介绍了Java多线程中线程安全问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 什么是线程安全和线程不安全?什么是线程安全呢?当多个线程并发访问某...
    99+
    2023-06-29
  • Linux之多线程以及多线程并发访问同一块内存的处理问题
    目录为什么需要多线程?多线程的优点最佳应用场景多线程的缺点验证思路总结为什么需要多线程? 并行实体共享同一个地址空间和所有可用数据 的这种能力是多进程锁无法表达的,因为多进程具有不同的地址空间;线程比进程更加轻量级,更加...
    99+
    2023-03-23
    Linux多线程 Linux多线程并发 多线程并发访问内存
  • Linux多线程及多线程并发访问同一块内存的问题怎么解决
    这篇文章主要介绍了Linux多线程及多线程并发访问同一块内存的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux多线程及多线程并发访问同一块内存的问题怎么解决文章都会有所收获,下面我们一起来看...
    99+
    2023-07-05
  • 聊聊java多线程创建方式及线程安全问题
    什么是线程 线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位。每个程序程序都至少有一个线程,也即是程序本身。 线程的状态 新建(New)...
    99+
    2024-04-02
  • Java多线程面试题(面试官常问)
    进程和线程 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是从一个进程从创建、运行到消亡的过程。在Java中,当我们启动main函数时其实...
    99+
    2024-04-02
  • 如何解决Java多线程死锁问题
    死锁问题 死锁定义 多线程编程中,因为抢占资源造成了线程无限等待的情况,此情况称为死锁。 死锁举例 注意:线程和锁的关系是:一个线程可以拥有多把锁,一个锁只能被一个线程拥有。 当两个...
    99+
    2024-04-02
  • Java多线程通信问题深入了解
    目录概述引入加入线程安全实现生产者与消费者问题总结概述 多线程通信问题,也就是生产者与消费者问题 生产者和消费者为两个线程,两个线程在运行过程中交替睡眠,生产者在生产时消费者没有在消...
    99+
    2024-04-02
  • MFC多线程传参问题怎么解决
    本篇内容主要讲解“MFC多线程传参问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MFC多线程传参问题怎么解决”吧!在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利...
    99+
    2023-06-17
  • java多线程并发问题如何解决
    在Java中,可以使用以下方法来解决多线程并发问题:1. 使用synchronized关键字:可以通过在方法或代码块前加上synch...
    99+
    2023-09-27
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作