gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:21:20 29 4
gpt4 key购买 nike

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

最佳答案

是的,交易适用于不同的 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();

}

关于database - SQLite 是否支持跨多个数据库的事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2685202/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com