взглянуть на эту тему: http://n2cms.codeplex.com/Thread/View.aspx?ThreadId=85016
В основном то, что он говорит, как возможная причина этого исключения:
2010-02-17 21: 01: 41,204 1 WARN NHibernate.Util.ADOExceptio nReporter - System.Data.SqlClient.SqlException: Журнал транзакций для базы данных 'databasename' заполнен. Для того, чтобы выяснить, почему пространство в журнале не могут быть повторно использованы, смотрите колонку log_reuse_wait_desc в sys.databases
как размер журнала транзакций является пропорционально количеству работы, проделанной в ходе сделки, возможно, вы должны обратите внимание на то, что ваши транзакционные границы обрабатываются командами обработчиков команд в записи транзакции. Затем вы, с сеансом # X, загрузите состояние, которое хотите изменить, измените его и зафиксируйте, все как одну единицу работы в #X.
Что касается чтения вещей, у вас может быть еще один ISession # Y, который считывает данные; этот ISession может использоваться для пакетного чтения в пределах, например. RepeatableRead или что-то подобное с функцией Futures и может просто считываться из кеша (albiet - это костыль). Выполнение этого способа может помочь вам оправиться от «ошибок», которых нет; оживления, тупики и операции с жертвами.
Проблема с использованием транзакции за запрос заключается в том, что ваш ISession приобретает много данных о бухгалтерском учете во время работы, все из которых являются частью транзакции.Следовательно, база данных помещает данные (rols, cols, tables и т. Д.) Как участвующие в транзакции, заставляя график ожидания охватывать «сущности» (в смысле базы данных, а не DDD-смысл), которые на самом деле не являются частью транзакционной границы команды, которую ваша заявка приняла.
Для записи (другие люди, занимающиеся поиском по Google), Фабио имел a post, занимающийся обработкой исключений из слоя данных. Цитирование некоторых из его кода;
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'
и посмотреть, что он вам дает.
Как вы управляете сеансами и транзакциями? –
Вы когда-нибудь находили решение? –