SQlite数据库的C编程接口(七) 数据库锁定(Database Locking)

对于《Using SQLite》的这一节内容,理解的不是很清楚。有时间要仔细看看SQLite的文档:http://www.sqlite.org/lockingv3.html(File Locking And Concurrency In SQLite Version 3

  SQLite使用一些不同的锁来保护数据库,以允许多个数据库连接同时访问一个相同的数据库文件,而不会出现数据库损坏。不管是在“自动提交事务(autocommit transaction)”模式,还是“显示事务(explicit transaction)”模式,这些锁都工作良好。

  SQLite锁系统(locking system)涉及几个不同层次的锁,用来减少竞争、避免死锁等等。以使SQlite允许多个数据库连接并行读取同一个数据库文件,不过任何写操作都需要完整的,整个数据库文件的独占访问。

  大部分时间锁系统(locking system)工作良好,允许不同的应用程序之间方便和安全的分享同一个数据库文件。如果编码得当,大部分写操作仅仅需要几分之一秒。然而,如果多个数据库连接试图在同一时间访问同一个数据库文件,那这些操作迟早会相遇。通常情况下,如果一个数据库操作需要一个暂时无法得到的锁,那么SQLite会返回SQLITE_BUSY,或者在更极端的情况下,返回SQLITE_IOERR(或者扩展码SQLITE_IOERR_BLOCKED)。函数sqlite3_prepare_xxx、sqlite3_step、sqlite3_reset、sqlite3_finalize会返回SQLITE_BUSY。函数sqlite3_backup_step、sqlite3_blob_open也会返回SQLITE_BUSY,因为在这两个函数的内部都是通过调用sqlite3_prepare_xxx、sqlite3_step函数来完成工作的。如果调用sqlite3_close函数时,所连接的数据库存在没有销毁(unfinalize)的语句,则该函数也会返回SQLITE_BUSY

  如果想访问某个锁,就需要等待其所有者完成并释放对它的使用,通常不会等待太长时间。等待(waiting)状态可以由应用程序处理,比如接收到SQLITE_BUSY应答,则再次尝试处理该语句。或者也可以由一个忙处理程序(busy handler)来处理。

忙处理程序(Busy handlers

  busy handler(忙处理程序)是一个回调函数,当SQLite library无法获取一个锁时调用。在busy handler中,可以继续尝试获取锁的操作,或者放弃并返回SQLITE_BUSY错误码。

  SQLite有一个内置的基于定时器的busy handler,可以给这个busy handler设置一个以毫秒为单位的超时时间。在超时时间范围内,busy handler将继续重复尝试获取锁的操作。

[cpp]  view plain copy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值