Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将TransactionScope与SQLite一起使用会导致数据库锁定异常_C#_Sqlite_Transactionscope - Fatal编程技术网

C# 将TransactionScope与SQLite一起使用会导致数据库锁定异常

C# 将TransactionScope与SQLite一起使用会导致数据库锁定异常,c#,sqlite,transactionscope,C#,Sqlite,Transactionscope,我正在尝试修改一个c代码,它使用TransactionScope,与Oracle一起工作,也与SQLite一起工作。我的代码的结构是,在访问SQLite数据库的事务范围内调用的每个方法都会创建自己的SQLiteConnection对象 现在,我在尝试在TransactionScope块中打开第二个连接时遇到问题。我正在通过将所有未使用的SQLiteConnection对象包装在using语句中或在finally块中调用dispose来妥善处理它们。无论我做什么,对SQLiteConnection

我正在尝试修改一个c代码,它使用
TransactionScope
,与Oracle一起工作,也与SQLite一起工作。我的代码的结构是,在访问SQLite数据库的事务范围内调用的每个方法都会创建自己的
SQLiteConnection
对象

现在,我在尝试在
TransactionScope
块中打开第二个连接时遇到问题。我正在通过将所有未使用的
SQLiteConnection
对象包装在using语句中或在finally块中调用
dispose
来妥善处理它们。无论我做什么,对
SQLiteConnection.Open的第二次调用都会在使用一段时间后超时
数据库被锁定为异常

示例代码:

using(var transaction = new TransactionScope(TransactionScopeOption.Required))
{
    using(var connection1 = new SQLiteConnection(_connectionString))
    {
        connection1.Open();
        ... // Do stuff with the open connection

    } // Closes the connection 

    using(var connection2 = new SQLiteConnection(_connectionString))
    {
        // database locked exception
        connection2.Open();          
        ... 
    } 
}
到目前为止,我所发现的关于这个问题的所有信息都在这篇文章中:这篇文章说:

TransactionScope持有独占写入程序锁,即使在 正在处理第一个连接。因为第一个连接无法连接 完全关闭自身,打开第二个连接将导致锁定 错误


不幸的是,本文没有提供任何解决方法。我非常希望坚持使用
TransactionScope
,因为必须将
SQLiteConnection
SQLiteTransaction
对象传递到我代码中的每个方法将是大量的重写工作,更不用说代码看起来会更加混乱。有什么建议吗?

您是否尝试使用SQLiteConnection的“BeginTransaction”方法而不是事务范围?是的,这很有效,但也很不方便,因为访问数据库的所有方法都需要共享同一个连接对象。我同意,但事务范围似乎不能很好地与SQLiteI一起工作,因为SQLiteI也有类似的问题;看,在重读你的问题后,我不确定是否有解决办法。据我所知,尝试打开第二个连接会将事务升级为MSDTC事务(这样做会将锁所有权转移到MSDTC),因此打开总是会失败。我想我的问题是,你为什么要打开第二个连接?Oracle代码就是这样做的,是的。。。我是在问为什么Oracle代码的结构如此复杂?