Date un'occhiata a questa discussione: http://n2cms.codeplex.com/Thread/View.aspx?ThreadId=85016
Fondamentalmente ciò che dice come una possibile causa di questa eccezione:
2010-02-17 21: 01: 41,204 1 WARN NHibernate.Util.ADOExceptio nReporter - System.Data.SqlClient.SqlException: Il log delle transazioni per il database 'database' è pieno. Per scoprire perché lo spazio nel log non può essere riutilizzato, vedere la colonna log_reuse_wait_desc in sys.databases
Come la dimensione del log delle transazioni è proporzionale alla quantità di lavoro svolto durante la transazione, forse si dovrebbe cerca di mettere i tuoi confini transazionali attraverso la "gestione" dei comandi da parte dei gestori sulla parte di scrittura delle transazioni. Quindi, con una sessione # X, carica lo stato che desideri modificare, lo metti in mutamento e lo commetti, tutto come un'unica unità di lavoro in #X.
Per quanto riguarda il lato di lettura delle cose, si potrebbe quindi avere un'altra IS # Y che legge i dati; questa ISession potrebbe essere utilizzata per le letture di batch all'interno ad es. Segnaposto ripetibile o qualcosa di simile con la funzione Futures e potrebbe semplicemente essere letto da una cache (anche se in realtà è una stampella). Facendolo in questo modo potrebbe aiutarti a recuperare da "errori" che non lo sono; livelock, deadlock e transazioni delle vittime.
Il problema con l'utilizzo di una transazione per richiesta è che l'ISession acquisisce molti dati di conservazione dei libri mentre si lavora, il che è parte integrante della transazione.Quindi il database segna i dati (rols, cols, tabelle, ecc.) Come partecipi alla transazione, facendo sì che il grafo di attesa si estenda su "entità" (nel senso del database, non nel senso DDD), che non sono in realtà parte del limite transazionale del comando richiesto dall'applicazione.
Per la cronaca (altre persone che utilizzano questo comando), Fabio aveva a post che si occupava di gestire le eccezioni dal livello dati. Citando un po 'del suo codice;
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 è il numero di eccezione per conflitto di vincoli.
- 208 è il numero di eccezione per un nome oggetto non valido nell'SQL.
- 3960 è il numero di eccezione per la transazione di isolamento dello snapshot interrotta a causa di conflitto di aggiornamento.
Quindi, se si verificano problemi di concorrenza come quello che descrivi; ricorda che invalideranno la tua ISession e che dovrai gestirli come sopra.
Parte di ciò che si sta cercando è CQRS, in cui si hanno lati di lettura e scrittura separati. Questo potrebbe aiutare: http://abdullin.com/cqrs/, http://cqrsinfo.com.
Quindi per riassumere; i tuoi problemi potrebbero essere legati al modo in cui gestisci le tue transazioni. Inoltre, prova a eseguire select log_wait_reuse_desc from sys.databases where name='MyDBName'
e vedere cosa ti dà.
Come stai gestendo le sessioni e le transazioni? –
hai mai trovato una soluzione a questo? –