В соответствии с документацией SQLite3, высвобождение точки сохранения верхнего уровня, не заключенное во внешнюю транзакцию, фиксирует ее изменения.Но на самом деле этого не происходит.Что может быть не так?
ОБНОВЛЕНИЕ :
Я выяснил, что происходит после отката предыдущей точки сохранения:
#include <sqlite3.h>
#include <stdio.h>
int main() {
sqlite3* db;
if (sqlite3_open("/Users/ababo/Desktop/test.sqlite3", &db) != SQLITE_OK) {
fprintf(stderr, "failed to create db: %s\n", sqlite3_errmsg(db));
return 1;
}
const char* sql = "SAVEPOINT sp";
if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
fprintf(stderr, "failed to create savepoint: %s\n", sqlite3_errmsg(db));
return 1;
}
sql = "ROLLBACK TO sp";
if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
fprintf(stderr, "failed to rollback savepoint: %s\n", sqlite3_errmsg(db));
return 1;
}
sql = "SAVEPOINT sp";
if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
fprintf(stderr, "failed to create savepoint again: %s\n",
sqlite3_errmsg(db));
return 1;
}
sql = "CREATE table t(f int)";
if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
fprintf(stderr, "failed to create table: %s\n", sqlite3_errmsg(db));
return 1;
}
sql = "RELEASE sp";
if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
fprintf(stderr, "failed to release savepoint: %s\n", sqlite3_errmsg(db));
return 1;
}
return 0;
}
ОБНОВЛЕНИЕ 2 :
Насколько я понимаю, проблема в том, что RELEASE sp
не удаляет точку сохранения из стека транзакций, поэтому следующий SAVEPOINT sp
выдвигает следующую точку сохранения.Есть ли способ удалить точку сохранения во время ее отката?