2012-01-31 34 views
2

我使用C#線程和解析一些數據,當我嘗試保存和提交與流利nhibernate這個數據我得到了死鎖。默認情況下不提交線程安全嗎?如何防止死鎖?線程,流利nhibernate和保存數據得到死鎖

//problem and where i get deadlock 
advertismentsDao.Save(ad); 
advertismentsDao.CommitChanges(); 

public T Save(T entity) 
{ 
    NHibernateSession.Save(entity); 
    return entity; 
} 

public void CommitChanges() 
{ 
    if (NHibernateSessionManager.Instance.HasOpenTransactionOn(SessionFactoryConfigPath)) 
    { 
     NHibernateSessionManager.Instance.CommitTransactionOn(SessionFactoryConfigPath); 
    } 
    else 
    { 
     // If there's no transaction, just flush the changesslate 
     NHibernateSessionManager.Instance.GetSessionFrom(SessionFactoryConfigPath).Flush(); 
    } 
} 

和錯誤:

Transaction (Process ID 78) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 
StackTrace: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 
    at System.Data.SqlClient.SqlDataReader.get_MetaData() 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() 
    at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) 
    at NHibernate.Id.IdentityGenerator.InsertSelectDelegate.ExecuteAndExtract(IDbCommand insert, ISessionImplementor session) 
    at NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder) 

回答

1

這是SQL僵局,而不是多線程

+2

這是一條評論不是答案:) – 2012-01-31 23:44:47

+0

THX的答案。 – senzacionale 2012-02-01 08:16:53

+0

這是sql死鎖,但爲什麼有時會出現死鎖,有時甚至沒有 – 2015-07-27 18:31:17