2010-04-21 111 views
7

我已经做了一些搜索,并阅读SQLite网站上的常见问题,没有运气找到我的问题的答案。SQLite是否支持跨多个数据库的事务?

这很可能是因为我的数据库方法有缺陷,但目前我想将数据存储在多个SQLite3数据库中,这意味着单独的文件。我非常担心由于我的应用程序可能崩溃导致数据损坏,或者在我的表格中更改数据的过程中发生停电。

为了保证数据的完整性,基本上,我需要做到这一点:

开始交易 数据库#修改桌1 修改表(一个或多个)数据库#2 提交或回滚如果错误

这是由SQLite支持吗?另外,我正在使用sqlite.net,特别是基于SQLite 3.6.23.1的最新版本。

UPDATE

一个问题 - 这事的人通常会增加他们的单元测试?我总是单元测试数据库,但从来没有像这样的情况。如果是这样,你会怎么做?这几乎就像你必须将另一个参数传递给像bool test_transaction这样的方法,如果它是真的,则在数据库访问之间引发异常。然后在调用之后进行测试,以确保第一组数据没有进入其他数据库。但也许这是SQLite测试涵盖的东西,如果而不是出现在我的测试用例中。

+0

我不认为你想要将它添加到单元测试。就好像交易运作良好,没有必要一次又一次地测试它们。只要做一些初步测试,以确保插入,更新,回滚等是适当的,你的好去处。 – 2010-04-21 18:30:37

+0

好吧,我认为这将是最好的。完善! – Dave 2010-04-21 18:37:04

回答

11

是的交易适用于不同的sqlite数据库,甚至sqlite和sqlserver之间。我试了几次。

一些链接和信息

从这里 - Transaction between different data sources.

由于SQLite的ADO.NET 2.0提供支持事务enlistement,不仅有可能进行交易跨越几个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(); 

} 
+0

我把我的帽子脱掉了。 +1! – 2010-04-21 19:09:47

+0

我仍然需要编写代码来执行跨多个数据库的事务,但我正在接近验证这一点! :) – Dave 2010-05-05 01:11:15

相关问题