SQLite

来源:互联网 发布:苏联解体经济数据 编辑:程序博客网 时间:2024/05/17 22:56

1、 事务:事务定义了一组SQL命令的边界,这组SQL或作为一个整体被全部执行或都不执行,典型案例就是银行转账;

2、 事务命令:BEGIN  COMMIT  ROLLBACK

3、 SQLite处理违反约束的方法:
replace:当违反了唯一完整性约束,将造成这种违反的记录删除,用新插入或新修改的来替代,SQL继续执行,不报错;
ignore
fail
abort
rollback

4、 SQLite锁:采用数据库锁,当一个连接要写数据库,所有其他的连接被锁住,直到写连接结束了它的事物;SQLite有个加锁表来帮助不同的写数据库都能在最后一刻再加锁从而保证最大的并发性;SQLite使用锁逐步上升机制,为了写数据库,连接需要逐级的获取排它锁;

5、 SQLite锁类型:
unlocked未加锁
shared共享锁:一个数据库可以有多个
reserved保留锁:一个数据库只能有一个
pending未决锁:等待共享锁释放连接后,升级为exclusive
exclusive排它锁:进行insertdeleteupdate操作
每个数据库连接在同一时刻只能处于其中一个状态,每种状态都有一种锁与之对应,当然除未加锁状态外

6、 SQLite锁运行流程:
最初的状态是未加锁状态,在此状态下,连接还没有写和读数据库,当连接到一个数据库,甚至已经用BEGIN开启一个事物时,连接都还处于未加锁状态;未加锁状态的下一个状态是共享状态,为了能够从数据库中读取数据,连接必须首先进入共享状态(shared),也就是首先获得一个共享锁(shared)。多个连接可以同时获得并保持共享锁,也就是说多个连接可以同时从同一个数据库读取数据,但哪怕有一个共享锁没有被释放,也不允许任何连接写入数据库;
如果一个连接想写入数据库,它必须先获取一个保留锁(reserved),一个数据库上同时只能保留一个保留锁(reserved),保留锁(reserved)可以与共享锁(shared)共存,保留锁(reserved)是写入数据库的第一阶段,保留锁(reserved)即不阻止其它拥有共享锁(shared)的连接继续读取数据库也不阻止其它连接获取新的共享锁(shared);一旦一个连接获取了保留锁(reserved),它就可以开始处理数据库来修改数据了,尽管这些操作只能在缓冲区中进行而不是实际写到磁盘,对读出内容所做的修改也保存在内存缓冲区中;
当连接想要提交修改时,需要将保留锁(resverved)升级为排它锁(exclusive),为了得到排它锁(exclusive),首先将保留锁(resverved)提升为未决锁(pending),获得未决锁(pending)之后,其他连接就不能再次获得新的共享锁(shared),对于已经拥有共享锁(shared)的连接仍然可以继续正常读数据库,此时拥有未决锁(pending)的连接等待其他拥有共享锁的连接完成工作并释放其共享锁(shared
一旦所有其他共享锁(shared)都被释放之后,拥有未决锁(pending)的连接可以将未决锁(pending)提升至排它锁(exclusive),此时就可以自由的对数据库进行updatedeleteinsert了,所有以前对缓冲区所做的修改都会被写入到数据库文件中;

7、 SQLite事物类型:
DEFERRED事物:不获取任何锁,直到它需要锁的时候;仅仅用begin开始一个事物,那么事物就是DEFERRED的,同时它不会获取任何锁,当对数据库进行第一次读操作时,它会获取共享锁(shared),同样当进行第一次写操作时它会获取保留锁(reserved
IMMEDIATE事物:尝试获取保留锁(reserved),如果成功,begin保证没有别的连接可以写入数据库,但是别的连接可以对数据库进行读取操作;但是保留锁(reserved)会阻止其它连接的begin immediatebegin exclusive命令,当其它连接执行上述命令时会返回SQLITE_BUSY错误,这时你就可以对数据库进行修改操作了,但是你还不能提交,当你commit时会返回SQLITE_BUSY错误,这就意味着还有其他的读取事物没有完成,得等它们执行完后才能提交事物;
EXCLUSIVE事物:尝试获取对数据库的排它锁(exclusive),这与IMMEDIATE类似,但是一旦成功,EXCLUSIVE事物保证没有其他的连接,所以就可以对数据库进行读写操作了;(尝试去申请,申请成功则读写数据库,申请不成功则继续申请)

begin immedidate  和  begin exclusive通常被用于写事物,就像同步机制一样,它防止死锁的产生,如果没有其他连接竞争,使用begin就可解决

0 0
原创粉丝点击