2010-04-21 101 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

相關問題