我正在尝试调整使用TransactionScope
的c#代码,并与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();
...
}
}
到目前为止,我发现的所有问题都在本文中:http://elegantcode.com/2010/07/02/using-transactionscope-with-sqlite/其中说:
即使在什么时候,TransactionScope仍然拥有独占的编写器锁 处理第一个连接。因为第一次连接不能 完全关闭自己,打开第二个连接导致锁定 错误。
不幸的是,该文章没有提供任何解决方法。我非常想坚持使用TransactionScope
因为必须将SQLiteConnection
和SQLiteTransaction
对象传递给我的代码中的每个方法都会有很多重写努力,更不用说代码了看起来更乱。有什么建议吗?