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

Posted

技术标签:

【中文标题】在sqlite3中,插入事务中的选择可以成功吗?【英文标题】:in sqlite3, can a select succeed within a transaction of insert? 【发布时间】:2010-09-27 11:12:30 【问题描述】:

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

【问题讨论】:

【参考方案1】:

是的。

在事务中,您的应用程序可以看到所有内容。

但是,没有其他事务可以看到更改的任何部分。

事务的重点是使一系列语句看起来像是对数据库的一次原子更改。

如果你提交,则事务中的所有语句都已完成,其他人都可以看到效果。

如果回滚,则事务中的任何语句都不会最终确定,数据库也不会发生任何变化。

顺便说一句,并非所有语句都可以成为事务的一部分。 DDL(例如创建和删除)将结束任何先前的事务。

【讨论】:

【参考方案2】:

是的,在交易期间或之后,您可以使用 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>

【讨论】:

以上是关于在sqlite3中,插入事务中的选择可以成功吗?的主要内容,如果未能解决你的问题,请参考以下文章

针对 20,000 多次更新优化 Sqlite3

如何检查 sqlite3 中的缓存大小

无法在 Sqlite3 Python Django 中的数据库中插入特定数据

什么是sqlserver中的事务

插入sqlite3数据库

SQLite数据库如何批量插入数据?