微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLite语法 BEGIN TRANSACTION

BEGIN TRANSACTION

sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name ]]
sql-statement ::= END [TRANSACTION [name ]]
sql-statement ::= COMMIT [TRANSACTION [name ]]
sql-statement ::= ROLLBACK [TRANSACTION [name ]]

从2.0版开始,sqlite支持带有回退和原子性的提交的事务处理。

可选的事务名称会被忽略。sqlite目前不允许嵌套事务。

在事务之外,不能对数据库进行更改。如果当前没有有效的事务,任何修改数据库的命令(基本上除了SELECT以外的所有sql命令)会自动启动一个事务。命令结束时,自动启动的事务会被提交。

可以使用BEGIN命令手动启动事务。这样启动的事务会在下一条COMMIT或ROLLBACK命令之前一直有效。但若数据库关闭 或出现错误且选用ROLLBACK冲突判定算法时,数据库也会ROLLBACK。查看ON CONFLICT 子句 获取更多关于ROLLBACK冲突判定算法的信息。

sqlite 3.0.8或更高版本中,事务可以是延迟的,即时的或者独占的。“延迟的”即是说在数据库第一次被访问之前不获得锁。 这样就会延迟事务,BEGIN语句本身不做任何事情。直到初次读取或访问数据库时才获取锁。对数据库的初次读取创建一个SHARED锁 ,初次写入创建一个RESERVED锁。由于锁的获取被延迟到第一次需要时,别的线程或进程可以在当前线程执行BEGIN语句之后创建另外的事务 写入数据库。若事务是即时的,则执行BEGIN命令后立即获取RESERVED锁,而不等数据库被使用。在执行BEGIN IMMEDIATE之后, 你可以确保其它的线程或进程不能写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE. 但其它进程可以读取数据库。 独占事务在所有的数据库获取EXCLUSIVE锁,在执行BEGIN EXCLUSIVE之后,你可以确保在当前事务结束前没有任何其它线程或进程 能够读写数据库

有关SHARED,RESERVED,和EXCLUSIVE锁可以参见这里

sqlite 3.0.8的认行为是创建延迟事务。sqlite 3.0.0 到3.0.7中延迟事务是唯一可用的事务类型。sqlite 2.8或更早版本中,所有的事务 都是独占的。

COMMIT命令在所有sql命令完成之前并不作实际的提交工作。这样若两个或更多个SELECT语句在进程中间而执行COMMIT时,只有全部SELECT 语句结束才进行提交。

执行COMMIT可能会返回sqlITE_BUSY错误代码。这就是说有另外一个线程或进程获取数据库的读取锁,并阻止数据库被改变。当COMMIT获得该错误代码时,事务依然是活动的,并且在COMMIT可以在当前读取的线程读取结束后再次试图读取数据库

搞自:sqlite中文网站:http://www.sqlite.com.cn/MysqLite/5/43.html 作者:tamsyn 来源:www.dws265.com 时间:2006-4-28

原文地址:https://www.jb51.cc/sqlite/203051.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐