Получение «Dababase заблокирован» при использовании NHibernate поверх SQLite (мультипроцессы без транзакций)

#c# #sqlite #nhibernate

#c# #sqlite #nhibernate

Вопрос:

Я использую Nhibernate поверх SQLite для одновременного чтения 10 таблиц из многих процессов. Даже если я не использую транзакции для этого, я все равно получаю «База данных заблокирована». Каждое чтение таблицы нарушало другое в другом процессе.

Я создал простое приложение на C #, которое использует System.Data.SQLite, чтобы воспроизвести проблему. Но все работало идеально. Проблема возникает только тогда, когда я использую NHibernate.

Кто-нибудь знает, в чем здесь может быть проблема? Спасибо за любую помощь.

Комментарии:

1. Не уверен, что это полезно для вас, но у меня была такая же проблема (без использования NHibernate). В итоге я использовал a ReaderWriterLockSlim , который позволяет нескольким читателям, но только одному писателю

Ответ №1:

Вы не предоставили код конфигурации; поэтому трудно догадаться. Что IsolationLevel вы установили? Установка этого значения ReadCommitted должна решить проблему.

С помощью Config-By-Code его можно установить, как показано ниже:

 configuration.SetProperty(NHibernate.Cfg.Environment.Isolation, "ReadCommitted");
 

С конфигурацией XML ее можно установить, как показано ниже:

 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
        <property name="connection.isolation">ReadCommitted</property>
    </session-factory>
</hibernate-configuration>
 

Кроме того, вы можете установить его при запуске транзакции, как показано ниже:

 session = SessionFactory.CreateSession();
transaction = session.BeginTransaction(isolationLevel);
 

Это может быть вам полезно.