对于《Usingsqlite》的这一节内容,理解的不是很清楚。有时间要仔细看看sqlite的文档:http://www.sqlite.org/lockingv3.html(FileLockingAndConcurrencyInsqliteVersion3)
sqlite使用一些不同的锁来保护数据库,以允许多个数据库连接同时访问一个相同的数据库文件,而不会出现数据库损坏。不管是在“自动提交事务(autocommittransaction)”模式,还是“显示事务(explicittransaction)”模式,这些锁都工作良好。
sqlite锁系统(lockingsystem)涉及几个不同层次的锁,用来减少竞争、避免死锁等等。以使sqlite允许多个数据库连接并行读取同一个数据库文件,不过任何写操作都需要完整的,整个数据库文件的独占访问。
大部分时间锁系统(lockingsystem)工作良好,允许不同的应用程序之间方便和安全的分享同一个数据库文件。如果编码得当,大部分写操作仅仅需要几分之一秒。然而,如果多个数据库连接试图在同一时间访问同一个数据库文件,那这些操作迟早会相遇。通常情况下,如果一个数据库操作需要一个暂时无法得到的锁,那么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应答,则再次尝试处理该语句。或者也可以由一个忙处理程序(busyhandler)来处理。
忙处理程序(Busyhandlers)
busyhandler(忙处理程序)是一个回调函数,当sqlitelibrary无法获取一个锁时调用。在busyhandler中,可以继续尝试获取锁的操作,或者放弃并返回sqlITE_BUSY错误码。
sqlite有一个内置的基于定时器的busyhandler,可以给这个busyhandler设置一个以毫秒为单位的超时时间。在超时时间范围内,busyhandler将继续重复尝试获取锁的操作。
用来设置内置busyhandler的超时时间,以毫秒为单位。如果给ms参数传递0或者负值,则内置的busyhandler被清除。
程序员也可以自己写busyhandler,然后通过aqlite3_busy_handler函数进行设置。