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