Я получаю исключения блокировки при попытке использовать транзакции с SubSonic и SQLite.Я использую это из одного потока, и нет других процессов, обращающихся к моей базе данных, поэтому я действительно не ожидал таких проблем.
Если я напишу код, подобный приведенному ниже, я получу исключение при втором вызове Save () в цикле - так что третий вызов Save () для всех.
using (TransactionScope ts = new TransactionScope())
{
using (SharedDbConnectionScope sharedConnectinScope = new SharedDbConnectionScope())
{
SomeDALObject x = new SomeDALObject()
x.Property1 = "blah";
x.Property2 = "blah blah";
x.Save();
foreach (KeyValuePair<string, string> attribute in attributes)
{
AnotherDALObject y = new AnotherDALObject()
y.Property1 = attribute.Key
y.Property2 = attribute.Value
y.Save(); // this is where the exception is raised, on the 2nd time through this loop
}
}
}
Если у меня есть операторы using (), как указано выше, или если у меня просто using (TransactionScope ts = new TransactionScope())
, то я получаю System.Data.SQLite.SQLiteException
с сообщением
Файл базы данных заблокирован
База данныхзаблокирован
Трассировка стека:
at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
at System.Data.SQLite.SQLiteTransaction..ctor(SQLiteConnection connection, Boolean deferredLock)
at System.Data.SQLite.SQLiteConnection.BeginDbTransaction(IsolationLevel isolationLevel)
at System.Data.SQLite.SQLiteConnection.BeginTransaction()
at System.Data.SQLite.SQLiteEnlistment..ctor(SQLiteConnection cnn, Transaction scope)
at System.Data.SQLite.SQLiteConnection.EnlistTransaction(Transaction transaction)
at System.Data.SQLite.SQLiteConnection.Open()
at SubSonic.SQLiteDataProvider.CreateConnection(String newConnectionString)
at SubSonic.SQLiteDataProvider.CreateConnection()
at SubSonic.SQLiteDataProvider.ExecuteScalar(QueryCommand qry)
at SubSonic.DataService.ExecuteScalar(QueryCommand cmd)
at SubSonic.ActiveRecord`1.Save(String userName)
at SubSonic.ActiveRecord`1.Save()
at (my line of code above).
Если у меня есть вложенные инструкции использования, наоборот, с SharedDbConnectionScope снаружи, то я получаю TransactionException
ссообщение «Операция недействительна для состояния транзакции».Трассировка стека:
at System.Transactions.TransactionState.EnlistVolatile(InternalTransaction tx, IEnlistmentNotification enlistmentNotification, EnlistmentOptions enlistmentOptions, Transaction atomicTransaction)
at System.Transactions.Transaction.EnlistVolatile(IEnlistmentNotification enlistmentNotification, EnlistmentOptions enlistmentOptions)
at System.Data.SQLite.SQLiteEnlistment..ctor(SQLiteConnection cnn, Transaction scope)
at System.Data.SQLite.SQLiteConnection.EnlistTransaction(Transaction transaction)
at System.Data.SQLite.SQLiteConnection.Open()
at SubSonic.SQLiteDataProvider.CreateConnection(String newConnectionString)
at SubSonic.SQLiteDataProvider.CreateConnection()
at SubSonic.SQLiteDataProvider.ExecuteScalar(QueryCommand qry)
at SubSonic.DataService.ExecuteScalar(QueryCommand cmd)
at SubSonic.ActiveRecord`1.Save(String userName)
at SubSonic.ActiveRecord`1.Save()
at (my line of code above)
, а внутреннее исключение - «Тайм-аут транзакции»
У меня нет никакого пользовательского кода в моих сгенерированных классах DAL или чего-либо еще умного, на мой взглядэто будет причиной этого.
Кто-нибудь еще сталкивался с подобными проблемами транзакций или кто-то может подсказать, где я начинаю искать проблему?
спасибо!
ОБНОВЛЕНИЕ: я замечаю упоминания о транзакциях вПримечания к выпуску для версий 1.0.61-65 (например, здесь ), поэтому, возможно, обновление SubSonic для работы с последней версией .Net Data Provider решит некоторые из этих проблем ...