Транзакционный sqlite? в C#
Я пишу прототип приложения. Прямо сейчас некоторые вещи терпят неудачу, такие как вставка неуникального столбца. В этом случае я хотел бы откатить все, что я сделал. Как я могу это сделать? Я также заметил, что в sqlite мне нужно зафиксировать данные, в C# он, кажется, делает это автоматически, что заставляет меня подозревать, что есть опция автоматического отката?
2 ответа
Откат: похоже, что вы ищете текст команды "INSERT OR ROLLBACK ... "
Транзакция: sqlite автоматически помещает каждую команду в собственную транзакцию, если вы не укажете, когда начинать. РЕДАКТИРОВАТЬ: TML объясняет эту часть более подробно в своем ответе
Пример явного открытия / совершения транзакции:
using (DbTransaction dbTrans = myDBConnection.BeginTransaction())
{
using (DbCommand cmd = myDBConnection.CreateCommand())
{
...
}
dbTrans.Commit();
}
SQLite.org говорит:
Изменения в блокировке и управлении параллелизмом в SQLite версии 3 также вносят некоторые тонкие изменения в работу транзакций на уровне языка SQL. По умолчанию SQLite версии 3 работает в режиме автоматической фиксации. В режиме автоматической фиксации все изменения в базе данных фиксируются, как только завершаются все операции, связанные с текущим подключением к базе данных.
Команда SQL "BEGIN TRANSACTION" (ключевое слово TRANSACTION является необязательным) используется для вывода SQLite из режима автоматической фиксации. Обратите внимание, что команда BEGIN не получает никаких блокировок в базе данных. После команды BEGIN блокировка SHARED будет получена при выполнении первого оператора SELECT. Блокировка RESERVED будет получена при выполнении первого оператора INSERT, UPDATE или DELETE. ИСКЛЮЧИТЕЛЬНАЯ блокировка не будет получена до тех пор, пока либо кэш памяти не заполнится и не будет отправлен на диск или пока транзакция не будет зафиксирована. Таким образом, система задерживает блокировку доступа для чтения к файлу файла до последнего возможного момента.