SQLite是否支持跨多个数据库的事务?

时间:2010-04-21 17:36:33

标签: database transactions sqlite system.data.sqlite

我已经做了一些搜索,也阅读了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测试所涵盖的内容,并且应该出现在我的测试用例中。

2 个答案:

答案 0 :(得分:13)

是的事务适用于不同的sqlite数据库,甚至在sqlite和sqlserver之间。我已经尝试了几次。

一些链接和信息

从这里开始 - Transaction between different data sources.

由于SQLite ADO.NET 2.0 Provider支持事务访问,因此不仅可以执行跨越多个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();

}

答案 1 :(得分:1)

是的,SQLite明确支持多数据库事务(有关技术详细信息,请参见https://www.sqlite.org/atomiccommit.html#_multi_file_commit)。但是,有一个很大的警告。如果数据库文件位于WAL mode中,则:

  

涉及对多个ATTACHed数据库进行更改的事务   对于每个单独的数据库都是原子的,但对于所有数据库不是原子   数据库作为一组。