SQLITE (интерфейс C/С++) - как совершить транзакцию

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

Теперь вот мой сценарий -

У меня есть 3 таблицы (связанные таблицы): A, B, C.

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

Теперь мне нужно две вещи.

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

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

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

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

С уважением, Арджун

Ответ 1

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

Ответ 2

Вы используете 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 документация для транзакций.