Почему освобождение точки сохранения без внешней транзакции не сохраняет изменения? - PullRequest
0 голосов
/ 25 апреля 2019

В соответствии с документацией 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 выдвигает следующую точку сохранения.Есть ли способ удалить точку сохранения во время ее отката?

1 Ответ

0 голосов
/ 27 апреля 2019

Команда RELEASE очищает стек транзакций второй sp точки сохранения.Однако внешняя (первая) точка сохранения все еще находится в стеке транзакций, поскольку команда ROLLBACK TO не не очищает целевую точку сохранения.Если бы вы использовали ROLLBACK (без предложения TO), то первая точка сохранения будет очищена.

Дополнительные сведения см. В SQLite docs .

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