в sqlite3 выбор может успешно выполниться в рамках транзакции вставки?

Начните с решения более общей задачи подсчета членов в списке . В конце концов, обработка термина - это обработка одноэлементного списка, содержащего этот термин:

count(A,T,N):- count(A, [T|Z],Z, 0,N).

count(_, [],  [], C,N):- N is C, !.
count(A, [T|B],Z, C,N):- ?=(A,T), A=T, !, count(A, B,Z, C+1,N).
count(A, [T|B],Z, C,N):- ?=(A,T), T=..[_|S], !, append(S,Y,Z), count(A, B,Y, C,N).
count(A, [_|B],Z, C,N):- count(A, B,Z, C,N).

Это открывает каждый главный термин в списке подряд и добавляет к нему свои аргументные термины [116 ] list , таким образом используя его как очередь ... таким образом обрабатывая второй аргумент предиката T способом в ширину .

Предполагается, что аргумент A является атомом, а ?= используется, чтобы избежать создания экземпляров свободных переменных, с которыми мы можем столкнуться, и вместо этого пропустить их, как, кажется, указывают ваши примеры.

8
задан Noah 14 February 2009 в 01:11
поделиться

2 ответа

Да.

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

Никакая другая транзакция, однако, не видит части изменения.

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

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

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

Не все операторы могут быть частью транзакции, BTW. DDL (Создают и Отбрасывание, например) закончит любую предыдущую транзакцию.

15
ответ дан 5 December 2019 в 08:54
поделиться

Да, во время или после транзакции вы можете использовать функцию 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>
4
ответ дан 5 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: