SQLite 事务
SQLite 事务
事务一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)。事务是以逻辑顺序完成的工作序列,这个序列保证无论如何都会全部执行或者遇到错误全部回滚到最初状态。
实际上,将许多SQLite查询合并到一个组中,并将它们作为事务的一部分一起执行。
事务的特性
事务有以下四个特性,通常用首字母ACID表示。
原子性:确保工作单元内的所有操作都成功完成;否则,事务会在失败时中止,以前的操作会回滚到它们以前的状态。
一致性:确保数据库在成功提交事务时正确更改状态。
隔离性:使事务能够彼此独立和透明地运行。
持久性:确保在系统故障的情况下,提交事务的结果或效果持续存在。
事务控制
以下是用于控制事务的命令:
BEGIN TRANSACTION :开始一个事务
COMMIT :提交事务,使当前的事务保存到数据库中。
ROLLBACK :回滚事务,用于恢复数据到初始状态。
事务控制命令仅与DML命令如INSERT、UPDATE和DELETE一起使用。创建表或删除表时不能使用它们,这些操作是在数据库中自动提交的。
BEGIN TRANSACTION命令
可以使用BEGIN TRANSACTION或BEGIN命令启动事务。这种事务通常持续到遇到下一个COMMIT或ROLLBACK命令。但是,如果数据库关闭或出现错误,事务也会回滚。以下是启动事务的简单语法。
BEGIN; or BEGIN TRANSACTION;
COMMIT命令
COMMIT命令是用于将事务调用的更改保存到数据库的命令。
COMMIT命令会将自上次提交或回滚命令以来的所有事务保存到数据库中。
以下是COMMIT命令的语法。
COMMIT; or END TRANSACTION;
ROLLBACK 命令
ROLLBACK命令是用于撤消尚未保存到数据库中的事务的命令。
ROLLBACK命令只能用于撤消自上次提交或回滚命令发出以来的事务。
以下是回滚命令的语法。
ROLLBACK;
例子
假设COMPANY表有如下数据:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
现在,让我们开始一个事务,删除表中符合从age=25的记录,然后,使用回滚命令撤消所有更改。
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> ROLLBACK;
现在,如果你查看COMPANY表,它仍然有以下记录
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
让我们开始另一个事务,删除表中符合从age=25的记录,最后我们使用COMMIT命令提交所有更改。
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> COMMIT;
如果你现在检查COMPANY表,AGE=25的记录就已经不存在了。
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 3 Teddy 23 Norway 20000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0