このスレッドを見てください:
http://n2cms.codeplex.com/Thread/View.aspx?ThreadId=85016
基本的に、この例外の考えられる原因として次のように述べています。
2010-02-17 21:01:41,204 1 WARN NHibernate.Util.ADOExceptionReporter - System.Data.SqlClient.SqlException: データベース 'databasename' のトランザクション ログがいっぱいです。ログ内のスペースを再利用できない理由を調べるには、sys.databases の log_reuse_wait_desc 列を参照してください。
トランザクション ログのサイズは、トランザクション中に行われた作業量に比例するため、トランザクションの書き込み部分でコマンドを「処理」するコマンド ハンドラにトランザクションの境界を設定することを検討する必要があります。次に、session#X を使用して、変更したい状態をロードし、変更してコミットします。すべて #X の 1 つの作業単位として行います。
読み取り側に関して言えば、データを読み取る別の ISession#Y があるかもしれません。この ISession は、たとえば RepeatableRead または Futures 機能と同様のもの内で読み取りをバッチ処理するために使用でき、単にキャッシュから読み取ることができます (実際には松葉杖ではありますが)。このようにすると、そうでない「エラー」から回復するのに役立つ場合があります。ライブロック、デッドロック、ビクティム トランザクション。
リクエストごとにトランザクションを使用する場合の問題は、作業中に ISession が大量の簿記データを取得することです。これらはすべてトランザクションの一部です。したがって、データベースはデータ (ロール、列、テーブルなど) をトランザクションに参加しているとマークし、実際には一部ではない (DDD の意味ではなく、データベースの意味で) 待機グラフを「エンティティ」にまたがらせます。アプリケーションが実行したコマンドのトランザクション境界。
記録として (他の人はこれをグーグルで調べています)、Fabio はデータ層からの例外の処理を扱った記事を持っていました。彼のコードの一部を引用します。
public class MsSqlExceptionConverterExample : ISQLExceptionConverter
{
public Exception Convert(AdoExceptionContextInfo exInfo)
{
var sqle = ADOExceptionHelper.ExtractDbException(exInfo.SqlException) as SqlException;
if(sqle != null)
{
switch (sqle.Number)
{
case 547:
return new ConstraintViolationException(exInfo.Message,
sqle.InnerException, exInfo.Sql, null);
case 208:
return new SQLGrammarException(exInfo.Message,
sqle.InnerException, exInfo.Sql);
case 3960:
return new StaleObjectStateException(exInfo.EntityName, exInfo.EntityId);
}
}
return SQLStateConverter.HandledNonSpecificException(exInfo.SqlException,
exInfo.Message, exInfo.Sql);
}
}
- 547 は、制約競合の例外番号です。
- 208 は、SQL 内の無効なオブジェクト名の例外番号です。
- 3960 は、更新の競合により中止されたスナップショット分離トランザクションの例外番号です。
したがって、あなたが説明したような同時実行の問題が発生している場合; これらは ISession を無効にし、上記のように処理する必要があることを覚えておいてください。
あなたが探しているかもしれないものの一部は、読み取り側と書き込み側が分離されている CQRS です。これが役立つかもしれません: http://abdullin.com/cqrs/、http://cqrsinfo.com。
要約すると、問題は、トランザクションの処理方法に関連している可能性があります。また、実行select log_wait_reuse_desc from sys.databases where name='MyDBName'
してみて、何が得られるかを確認してください。