Tener un vistazo a este tema: http://n2cms.codeplex.com/Thread/View.aspx?ThreadId=85016
Básicamente lo que dice como una posible causa de esta excepción:
2010-02-17 21: 01: 41,204 1 WARN NHibernate.Util.ADOExceptio nReporter - System.Data.SqlClient.SqlException: El registro de transacciones para la base de datos 'databasename' está lleno. Para averiguar por qué el espacio en el registro no puede ser reutilizado, ver columna log_reuse_wait_desc en sys.databases
medida que el tamaño del registro de transacciones es proporcional a la cantidad de trabajo realizado durante la transacción, tal vez usted debe busque en poner sus límites transaccionales en el manejo de los manejadores de comandos de los comandos en la parte de escritura de las transacciones. Luego, con una sesión n. ° X, cargue el estado que desea mutar, muévalo y confírmelo, todo como una unidad de trabajo en #X.
Con respecto al lado de lectura de las cosas, es posible que tenga otra ISession # Y que lea datos; esta ISession se puede usar para leer por lotes, p. RepeatableRead o algo similar con la función Futures y podría simplemente estar leyendo desde un caché (aunque es una muleta). Hacerlo de esta manera puede ayudarlo a recuperarse de "errores" que no lo son; livelocks, deadlocks y transacciones de víctimas.
El problema con el uso de una transacción por solicitud es que su ISession adquiere una gran cantidad de datos contables mientras trabaja, todo lo cual es parte de la transacción.Por lo tanto, la base de datos marca los datos (rols, cols, tables, etc.) como participantes en la transacción, haciendo que el gráfico de espera abarque "entidades" (en el sentido de la base de datos, no el DDD-sense), que en realidad no son parte del límite transaccional del comando que tomó su aplicación.
Para el registro (otras personas buscando en Google esto), Fabio tenía a post que trata de hacer frente a las excepciones de la capa de datos. Citando parte de su código;
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 es el número de excepción de conflictos de restricciones.
- 208 es el número de excepción para un nombre de objeto no válido en el SQL.
- 3960 es el número de excepción para la transacción de aislamiento de instantánea cancelada debido a un conflicto de actualización.
Así que si se encuentra con problemas de simultaneidad como los que describe; recuerde que invalidarán su ISession y que usted tendrá que manejarlos como los anteriores.
Parte de lo que usted podría estar buscando es CQRS, donde tiene lados de lectura y escritura separados. Esto podría ayudar: http://abdullin.com/cqrs/, http://cqrsinfo.com.
Así que para resumir; sus problemas pueden estar relacionados con la forma en que maneja sus transacciones. Además, intente ejecutar select log_wait_reuse_desc from sys.databases where name='MyDBName'
y vea lo que le ofrece.
¿Cómo gestionas las sesiones y las transacciones? –
¿alguna vez encontró una solución a esto? –