IDジェネレーターをインクリメントとしてSystem.TransactionsTransactionScopeでSQLiteを使用しようとすると、NHibernateが次のID番号を取得しようとしたときに、例外(以下にコードとともに示されています)が発生していることに気付きました。
これは、新しいSQLite接続が現在のトランザクションの自動登録を実行しているためと思われます。私が聞いたところによると、SQLiteは単一の書き込みトランザクションのみをサポートしていますが、複数の読み取りをサポートする必要があるため、読み取り操作でデータベースロック例外が発生していることに驚いています。誰かがこの方法でトランザクションスコープでSQLiteを使用しましたか?
TransactionScopeの代わりにNHibernateトランザクションを使用すると、同じコードが正常に機能します
コードブロック:
using (var scope = new TransactionScope())
{
var userRepository =
container.GetInstance<IUserRepository>();
var user = new User();
userRepository.SaveOrUpdate(user);
scope.Complete();
}
例外:
19:34:19,126 ERROR [ 7] IncrementGenerator [(null)]- could not get
increment value
System.Data.SQLite.SQLiteException: The database file is locked
database is locked
at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
at System.Data.SQLite.SQLiteTransaction..ctor(SQLiteConnection
connection, Boolean deferredLock)
at System.Data.SQLite.SQLiteConnection.BeginTransaction(Boolean
deferredLock)
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 NHibernate.Connection.DriverConnectionProvider.GetConnection()
at NHibernate.Id.IncrementGenerator.GetNext(ISessionImplementor
session)
19:34:20,063 ERROR [ 7] ADOExceptionReporter [(null)]- The database
file is locked
database is locked