在sqlite3中,可以在insert的事务中成功选择吗?

use*_*404 8 database sqlite transactions acid

我开始一个事务,即将几条记录插入表中.在事务提交之前,我可以从数据库中选择最新插入的记录吗?

S.L*_*ott 15

是.

在交易中,您的应用程序会查看所有内容

但是,没有其他交易可以看到变更的任何部分.

事务的关键是使一系列语句看起来是数据库的一个原子变化.

如果您提交,则事务中的所有语句都将完成,其他所有语句都可以看到效果.

如果回滚,则不会最终确定事务中的语句,并且数据库不会发生任何更改.

并非所有陈述都可以成为交易的一部分,BTW.DDL(例如,创建和删除)将结束任何先前的事务.


Noa*_*oah 7

是的,在交易期间或之后,您可以使用 last_insert_rowid() 函数。

last_insert_rowid() 函数返回从调用该函数的数据库连接插入的最后一行的 ROWID。

换句话说:

SQLite version 3.6.23
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

sqlite> create table T (C);
sqlite> insert into T values ('hello');
sqlite> select last_insert_rowid();
1
sqlite> BEGIN;
sqlite> insert into T values ('test 2');
sqlite> select last_insert_rowid();
2
sqlite> select rowid,* from T;
1|hello
2|test 2
sqlite> ROLLBACK;
sqlite> select last_insert_rowid();
2
sqlite> select rowid,* from T;
1|hello
sqlite>
Run Code Online (Sandbox Code Playgroud)