Как зафиксировать транзакцию SQLite в C / C ++? - PullRequest
16 голосов
/ 21 мая 2010

Я использую интерфейс sqlite c / c ++.

У меня есть 3 таблицы (связанные таблицы), скажем, A, B, C. Теперь есть функция с именем Set , которая получает некоторые входные данные и на основе этих данных вставляет строки в эти три таблицы. (иногда это может быть обновление в одной из таблиц)

Теперь мне нужны две вещи. Во-первых, я не хочу функцию автоматической фиксации. По сути, я хотел бы совершать после каждых 1000 вызовов Set function

Во-вторых, в самой функции set, если я обнаружил, что после вставки в две таблицы третья вставка не удалась, я должен был отменить эти конкретные изменения в этом вызове функции .

Теперь я не вижу никакой функции sqlite3_commit. Я вижу только функцию с именем sqlite3_commit_hook (), которая немного отличается от документации.

Есть ли какая-либо функция, выставленная для этой цели? или как добиться такого поведения?

Можете ли вы помочь мне с наилучшим подходом сделать это.

Ответы [ 2 ]

33 голосов
/ 23 мая 2010

Вы используете sqlite3_exec и проходите «НАЧАЛО СДЕЛКИ» и «КОНЕЦ СДЕЛКИ» соответственно.

// 'db' is the pointer you got from sqlite3_open*
sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL);
// Any (modifying) SQL commands executed here are not committed until at the you call:
sqlite3_exec(db, "END TRANSACTION;", NULL, NULL, NULL);

Для этих команд SQL существуют синонимы (например, COMMIT вместо END TRANSACTION). Для справки вот документация SQLite для транзакций .

2 голосов
/ 21 мая 2010

можете ли вы использовать SQL-операторы BEGIN, COMMIT и ROLLBACK внутри кода C / C ++?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...