SQLite 事务总结

SQLite SQL 编程 数据库 事务

这篇文章主要用简练的语言而不是大段的例子来介绍 SQLite 的事务,包括相关概念、语句和注意事项。关于 SQLite 的事务,网上有很多例子,如有需要可以自行搜索。本文系个人学习后的总结,并非转载或者采集

事务是什么

事务就是一组要求数据库依次完成的任务。这些任务可能是更新一行数据,或者删除一行数据。

为什么使用事务

确保顺序防止意外(比如删除之后没办法再读取),以及可以回滚(撤销操作)。

事务和查询

事务由一个或多个具有先后次序的查询组成。平时如果只有一个查询,没有排序的需要,一般不使用事务语句,但它仍然是一个事务。

事务语句

BEGIN – 事务开始的标记

COMMIT – 事务结束的标记

SAVEPOINT – 保存点标记,可以理解为游戏存档点,可以回滚到标记的位置

RELEASE – 释放保存点标记,相当于删除存档点,这样就没办法读这个档了

ROLLBACK – 回滚标记,时光机回到事务开始前的样子,然后就直接结束事务

ROLLBACK TO – 回滚到保存点标记,读档之后重启事务,注意多了个 TO 关键字

注意事项

BEGINCOMMIT 配对,最多只能有一个事务,不能嵌套,所以不存在BEGIN;BEGIN;COMMIT;COMMIT; 的情况。 

SAVEPOINTRELEASE 配对,可以嵌套,都要带标识符(名字)。比如 SAVEPOINT a; 和  RELEASE a;  。

标识符可以重复,但如果配对失败(比如 RELEASE a 但是之前并没有 SAVEPOINT a)就会报错。如果成功匹配,而它们中间还有一个 SAVEPOINT b,那么这个 b 点也会被清除掉。

只要后面跟的名字对上号, RELEASE 就会把对应的 SAVEPOINT 释放掉(删掉存档)。如果有多个名字一样的 SAVEPOINT,会删掉离 RELEASE 最近的一个。

SAVEPOINT 类似于 BEGINRELEASE 类似于 COMMIT,区别只是在于前者需要命名而且允许嵌套,喜欢的话可以将其取代(虽然没什么好处,反倒要多想一个名字)。

可以理解为如果中途没有回滚,撑到最后的任务就会被真正执行;如果有回滚,被回滚的部分做的更改不会执行,所以不要以为 RELEASE 等于 ROLLBACK,它并不「释放」更改,只是「释放」了存档点,使得没办法进行这一部分的回滚操作而已。

嵌套结构外部会对内部产生影响。如果它是嵌套的(比如在 BEGINCOMMIT 之间),没有到最后一步,RELEASE 所做的更改都不会更新到数据库,外层的 ROLLBACK 可以把它的更改消除掉。

当然,如果这个 RELEASE 本来就在最外层代替 COMMIT,和代替 BEGIN 的 SAVEPOINT 遥相呼应,当它 COMMIT 用完全没问题。

COMMIT 会直接结束事务,事务内所有的 SAVEPOINT 都会被一次性清除。参考链接

参考链接

SQLite – SQL As Understood By SQLite

发表评论

电子邮件地址不会被公开。 必填项已用*标注