SQLite Database System Design and Implemention Pager Module 概述

通过阅读本节,你应当能够解释解释以下问题:

1.page cache是什么?为什么需要它?谁在使用它?
2.一般的缓存管理技术
3.SQLite采用的事务处理过程以及回滚过程

本章讨论了pager模块,该模块在原生的字节文件上实现了抽象的数据库页文件系统,扮演着 固定大小的数据页面的管理者,定义了从数据库文件中获取
这些页面的接口。它通过提供对数据文件的内存层面上的缓存来帮助Tree模块加速获取数据库页面,也就是说它管理着页面缓存。它还是事务管理器,该事务实现了ACID特性通过并发访问控制和失败回滚的处理。
它使并发控制和回滚操作对Tree和其他更高的模块完全透明。它仍旧扮演者锁和日志管理者的角色。事实上,pager模块实现了一般数据库管理系统中的持久性。

除了内存数据库之外,数据库都位于外部存储器比如磁盘,用原始的文件存储着。
SQLite不能高效的获取以及控制数据在磁盘上。
当SQLite需要数据的时候,它从数据库文件中将其读取到主存中,在内存中控制该数据,并且在有需要的时候,将该数据写回到数据库文件中。
一般来说,数据库文件的总的大小比可用的内存大小大得多。由于有限大小的的主存,仅仅一部分内存预留给数据库文件,这个比例对整个数据库文件来讲,很小,并且这个预留的内存空间通常叫做数据库缓存或者数据缓冲区;在SQLite的术语中,它被称作page cache.这个缓存位于应用处理的地址空间,不是位于操作系统的空间。操作系统拥有自己的数据缓存。

在SQLite当中page缓存管理器被叫做pager。

该模块面向的是下层的以字节为单位的普通的原生文件,并且转换他们成为可以随机访问的高层面上的以page为单位的文件,这些page都是固定大小的对象,都是从原生的文件系统中读出。

不同层次的文件可以有不同page大小。
pager为读取这些数据库文件定义了独立于文件系统的可以方便使用的接口。
tree模块直接位于pager模块的上层,从始至终都在使用pager模块提供的接口访问数据库,从不直接访问任何数据库文件或者日志文件。tree模块面对的数据库文件就像一个统一大小的page组成的逻辑数组一样,并且访问这些page通过他们的下标。

SQLite中美国也你打开的数据库文件也可以说是数据库链接都维护着一个独立的page缓存。
当一个应用程序打开一个数据库文件的时候,pager模块就会为这个文件创建并且初始化一个新的page缓存
如果该程序打开相同的数据库文件两次或者更多的次数,在默认的处理模式中,pager创建并且初始化同样多的独立的page 缓存为这个数据库文件。

SQLite支持一个高级特性,该特性支持所有打开同一个数据库的链接共享同样的page 缓存,该文件可能被相同的或者不同的数据库链接打开了多次。
在内存型数据库中,没有任何数据指向外部存储区,但是,他们也是同样的通过pager来处理和保存数据。因此,tree 模块使用同样的接口来获取不同类型的数据库。

pager 是SQLite中层次最低的模块。它是唯一的通过原生的操作系统提供的IO 接口访问原生数据文件和日志文件的模块。

他直接读取和写数据库文件以及日志文件。
他不理解数据是如何在数据库中组织存放的。他也不与数据库中的内容进行交互,不会自己对数据内容进行修改。
他仅仅保证无论什么信息在数据库文件中存储着,都能重复的获取不用任何转换。
在某种意义上,pager是一个被动的实体。
虽然它可能会修改数据库文件的一些头信息,比如文件的变化次数。
他将对数据库文件的操作工作从一般的随机访问的字节形式的文件系统,抽象成一个随机访问的页面系统。
他定义了一套易于使用,独立于文件系统接口的可以随机访问数据库文件页面的接口。

对每个数据库文件来说,在数据库文件与内存之间移动page是pager作为缓存管理器的基础功能。
这个页面移动是透明的对于tree和更高层面的模块。
pager是一个原生文件系统和高层次模块之间的媒介。
他的主要目的就是使数据库页面在内存中是可以寻址的,从而使这些模块能直接访问内存中的页面内容。
他还定位了写页面回数据库文件的位置。
他创造了一个抽象的概念,数据库文件是以数组形式的页面存放于内存中的,tree和pager两个模块通过定义良好的页面访问协议一起工作。

除了缓存管理工作,pager还承担了很多其他很多的一个典型数据库管理系统应该具有的功能。
他提供了典型的事务处理系统的核心服务:事务管理,数据管理,日志管理和锁管理

作为一个事务管理器,他实现了事务的ACID特性通过管理并发空调制和回滚操作。
他并且负责了原子性的提交和事务回滚。
作为一个数据管理器,他定位读和写数据库文件通过内存中的缓存页面,并且负责文件空间管理工作。
作为一个日志管理器,他实现了往日志文件中写日志记录。
作为一个锁管理器,他保证了事务在获取一个数据库页面之前,已经拥有了数据库文件上的合适的锁。
在本质上说,pager模块实现了存储的持久性和事务的原子性。

转载于:https://my.oschina.net/u/244278/blog/3095077

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Three well-known computer scientists at Stanford University-Hector Garcia-Molina, Jeffrey D. Ullman, and Jennifer Widom-have written one of the most comprehensive books on database system implementation. Hector Garcia- Molina pioneered this book at Stanford as a second database systems course for computer science majors and industry-based professionals. It focuses on the implementation of database systems, including storage structures, query processing, and transaction management. Database System Implementation is valuable as an academic textbook or a professional reference. Noteworthy Features *Provides extensive coverage of query processing, including major algorithms for execution of queries and techniques for optimizing queries *Covers information integration, including warehousing and mediators, OLAP, and data-cube systems *Explains error-correction in RAID disks and covers bitmap indexes, data mining, data statistics, and pointer swizzling *Supports additional teaching materials found on the book's Web page at http://www-db.stanford.edu/-html *For college courses Prentice Hall offers a two-book package discount with A First Course in Database Systems and Database System Implementation This text covers a broad spectrum of knowledge and technology. This carefully class-tested, highly readable presentation provides students or professionals with the next level of study. Written from the point of view of the database designer, user, and application programmer, this book provides practical advice from well-know experts on how to implement state-of-the-art database systems.
### 回答1: 当出现"sqlite database is locked"的错误时,意味着有其他进程或线程正在访问或修改数据库文件,并且已经对其进行了独占锁定。SQLite数据库使用一种称为独占性写入锁(exclusive write lock)的算法来处理并发访问。 造成数据库被锁定的常见情况有以下几种: 1. 在一个连接中同时启动多个事务并尝试修改数据库SQLite数据库一次只能有一个写入事务,其他事务必须等待直到当前事务完成。 2. 在一个连接中同时启动多个写操作(如插入、更新或删除)线程,并尝试同时修改数据库。 3. 一个事务在长时间运行(例如,处理大量数据)而没有释放锁定,导致其他连接无法获取锁定。 为解决"sqlite database is locked"错误,可以采取以下几种方法: 1. 确保在一个连接中只有一个事务在操作数据库:在一个事务执行完毕前,不要同时启动其他事务。 2. 在使用写操作之前,检查数据库是否已经被锁定。可以使用SQLite的函数`sqlite3_busy_timeout()`来设置等待锁定的超时时间,以避免长时间阻塞。 3. 优化事务操作:将事务分解为多个较小的事务,或者使用批量插入、更新和删除操作来减少每个操作的次数。 4. 如果可能的话,通过使用缓存机制或调整读写操作的时间,尽量减少数据库的并发读写操作。 最后,需要注意的是,使用SQLite时要正确处理并发访问以及锁定,以保证数据库的一致性和可用性。 ### 回答2: "sqlite database is locked" 是SQLite数据库中的一个错误信息,表示当前的数据库文件被其他进程锁定,无法执行请求的操作。 当多个进程或线程同时访问同一个SQLite数据库文件时,会出现锁定现象。这是为了确保数据的完整性和一致性,避免多个进程同时修改数据库而导致冲突和损坏。 出现"sqlite database is locked"错误的情况有以下几个可能原因: 1. 并发访问:如果多个进程或线程同时试图访问数据库,其中一个进程可能会独占数据库文件资源,而其他进程则被阻塞并显示此错误。 2. 锁定问题:一个进程已经开始了一个事务并锁定了数据库文件,而另一个进程尝试访问相同的数据库文件,发生冲突。 3. 操作冲突:当一个进程正在执行一个写操作时,另一个进程也尝试执行写操作,会产生冲突。SQLite不支持并发写操作,因此会产生"sqlite database is locked"错误。 解决这个问题的方法有: 1. 等待:可以通过等待一段时间,让占用数据库资源的进程完成操作,然后再次尝试访问数据库。 2. 优化并发操作:通过合理地规划数据库操作顺序、使用合适的事务管理和锁定机制,以减少并发访问时的冲突机会。 3. 重新设计应用程序:如果并发访问需求较高,可以重新设计应用程序架构,使用数据库服务器或其他分布式数据库解决方案,来更好地支持并发操作。 总之,"sqlite database is locked"错误表示数据库文件被其他进程锁定,我们需要合理规划并发访问,使用合适的解决方法来解决这个问题。 ### 回答3: SQLite数据库被锁是一个常见的错误,通常是由于多个进程或线程同时尝试对同一个数据库进行读写操作而导致的。当一个进程或线程正在执行一个事务并且没有释放锁时,其他进程或线程将无法访问该数据库,从而导致数据库被锁。 解决这个问题的方法有几种: 1. 等待:可以尝试在一段时间内等待数据库锁的释放,然后重试执行操作。这可能需要根据具体情况调整等待时长。 2. 优化访问模式:检查代码中的访问模式,并确保每个进程或线程都按照正确的顺序访问数据库,以避免出现冲突。 3. 使用事务:事务可以保证对数据库的原子性操作,最大限度地减少锁定时间。确保在适当的时候开始和提交事务。 4. 关闭连接:在某些情况下,关闭所有尝试访问数据库的连接,并重新打开连接可能有助于解决锁定问题。 总的来说,解决SQLite数据库被锁问题的关键在于识别并处理潜在的并发访问冲突,采取适当的措施以确保线程安全并最大限度地减少对数据库的访问冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值