в sqlite3 может ли выбор быть успешным в транзакции вставки? - PullRequest
7 голосов
/ 18 декабря 2008

Я начинаю транзакцию, которая заключается в вставке нескольких записей в таблицу. Можно ли выбрать последнюю вставленную запись из базы данных до принятия транзакции?

Ответы [ 2 ]

14 голосов
/ 18 декабря 2008

Да.

Внутри транзакции ваше приложение видит все.

Однако никакая другая транзакция не видит какую-либо часть изменения.

Смысл транзакции состоит в том, чтобы последовательность операторов выглядела как одно атомарное изменение в базе данных.

Если вы совершите коммит, все операторы в транзакции будут завершены, и все остальные смогут увидеть эффект.

Если выполнить откат, оператор в транзакции не будет завершен, и в базе данных не произойдет никаких изменений.

Кстати, не все выписки могут быть частью транзакции. DDL (например, Create и Drop) завершит любую предыдущую транзакцию.

4 голосов
/ 17 апреля 2010

Да, во время или после транзакции вы можете использовать функцию 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>
...