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 и не должно появляться в моих тестовых сценариях.

10
задан ybungalobill 8 March 2019 в 19:21
поделиться

1 ответ

​​Да, транзакции работают с разными базами данных 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();

}
13
ответ дан 3 December 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: