【问题标题】:Does SQLite support transactions across multiple databases?SQLite 是否支持跨多个数据库的事务?
【发布时间】:2011-02-10 17:28:58
【问题描述】:

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

【问题讨论】:

  • 我认为您不想将其添加到单元测试中。就像事务运行良好一样,一次又一次地测试它们是没有意义的。只需进行一些初步测试,以确保插入、更新、回滚等正确无误并且一切顺利。
  • 好的,我觉得这样最好。完美!

标签: database transactions sqlite system.data.sqlite


【解决方案1】:

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

}

【讨论】:

  • 我仍然需要编写代码来跨多个数据库执行事务,但我即将验证这一点! :)
  • 该链接已损坏。
  • @BrianMinton 更新了 archive.org 链接。原来是404。
【解决方案2】:

是的,SQLite 明确支持多数据库事务(有关技术细节,请参阅https://www.sqlite.org/atomiccommit.html#_multi_file_commit)。但是,有一个相当大的警告。如果数据库文件在WAL mode,那么:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2019-04-10
    • 2017-11-15
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多