Поддерживает ли SQLite транзакции в нескольких базах данных?

Я немного поискал, а также прочитал FAQ на сайте SQLite, но мне не удалось найти ответ на свой вопрос.

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

Для обеспечения целостности данных мне в основном нужно сделать следующее:

begin transaction
modify table(s) in database #1
modify table(s) in database #2
commit, or rollback if error

Поддерживается ли это SQLite? Кроме того, я использую sqlite.net, в частности последнюю версию, основанную на SQLite 3.6.23.1.

ОБНОВЛЕНИЕ

Еще один вопрос - это то, что люди обычно добавляют в свои модульные тесты? Я всегда тестирую базы данных, но никогда не сталкивался с подобными случаями. И если да, то как бы вы это сделали? Это почти похоже на то, что вам нужно передать другой параметр методу, например bool test_transaction, и, если он истинен, генерировать исключение между доступами к базе данных. Затем проверьте после вызова, чтобы убедиться, что первый набор данных не попал в другую базу данных. Но, возможно, это то, что покрывается тестами SQLite и не должно не появляться в моих тестовых примерах.


person Dave    schedule 21.04.2010    source источник
comment
Не думаю, что вы хотите добавлять это в модульные тесты. Это похоже на то, что если транзакции работают нормально, нет смысла тестировать их снова и снова. Просто проведите несколько начальных тестов, чтобы убедиться, что вставки, обновления, откаты и т. Д. Правильные и все в порядке.   -  person Aseem Gautam    schedule 21.04.2010
comment
хорошо, я подумал, что так будет лучше. идеально!   -  person Dave    schedule 21.04.2010


Ответы (2)


Да, транзакции работают с другой базой данных sqlite и даже между sqlite и sqlserver. Пару раз пробовал.

Некоторые ссылки и информация

Отсюда - Транзакция между разными источниками данных.

Поскольку поставщик SQLite ADO.NET 2.0 поддерживает регистрацию транзакций, можно не только выполнять транзакцию, охватывающую несколько источников данных SQLite, но также и другие механизмы базы данных, такие как SQL Server.

Пример:

using (DbConnection cn1 = new SQLiteConnection(" ... ") )
using (DbConnection cn2 = new SQLiteConnection(" ... "))
using (DbConnection cn3 = new System.Data.SqlClient.SqlConnection( " ... ") )
using (TransactionScope ts = new TransactionScope() )
{
    cn1.Open(); cn2.Open(); cn3.Open();
    DoWork1( cn1 );
    DoWork2( cn2 );
    DoWork3( cn3 );
    ts.Complete();
}

Как прикрепить новую базу данных:

SQLiteConnection cnn = new SQLiteConnection("Data Source=C:\\myfirstdatabase.db");
cnn.Open();

using (DbCommand cmd = cnn.CreateCommand())
{
  cmd.CommandText = "ATTACH DATABASE 'c:\\myseconddatabase.db' AS [second]";
  cmd.ExecuteNonQuery();

cmd.CommandText = "SELECT COUNT(*) FROM main.myfirsttable INNER JOIN second.mysecondtable ON main.myfirsttable.id = second.mysecondtable.myfirstid";


  object o = cmd.ExecuteScalar();

}
person Aseem Gautam    schedule 21.04.2010
comment
Мне все еще нужно написать код для выполнения транзакций в нескольких базах данных, но я близок к тому, чтобы проверить это! :) - person Dave; 05.05.2010
comment
Эта ссылка не работает. - person Brian Minton; 24.08.2018
comment
@BrianMinton Обновлено по ссылке archive.org. Оригинал - 404. - person Aseem Gautam; 24.08.2018

Да, SQLite явно поддерживает транзакции с несколькими базами данных (см. https://www.sqlite.org/atomiccommit.html#_multi_file_commit для получения технических подробностей). Однако есть довольно большой нюанс. Если файл базы данных находится в режиме WAL, то:

Транзакции, которые включают изменения в нескольких базах данных с ATTACHed, являются атомарными для каждой отдельной базы данных, но не атомарны для всех баз данных в наборе.

person Brian Minton    schedule 24.08.2018