通常它工作正常,但在某些情況下(我不能複製)我收到的NullReferenceException與堆棧跟蹤:NullReference與交易處置會話時
at Npgsql.NpgsqlCommand.ClearPoolAndCreateException(Exception e) in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 1505 at Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 650 at Npgsql.NpgsqlCommand.ExecuteBlind() in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 499 at Npgsql.NpgsqlTransaction.Rollback() in C:\projects\Npgsql2\src\Npgsql\NpgsqlTransaction.cs:line 185 at Npgsql.NpgsqlTransaction.Dispose(Boolean disposing) in C:\projects\Npgsql2\src\Npgsql\NpgsqlTransaction.cs:line 141 at NHibernate.Transaction.AdoTransaction.Dispose(Boolean isDisposing) in p:\nhibernate-core\src\NHibernate\Transaction\AdoTransaction.cs:line 368 at NHibernate.Impl.SessionImpl.Close() in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 380 at NHibernate.Impl.SessionImpl.Dispose(Boolean isDisposing) in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 1738 at NHibernate.Impl.SessionImpl.Dispose() in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 1709
public virtual IEnumerable<User.PublishedInfo> GetUsersByXP(int count)
{
using (ISession session = SessionFactory.OpenSession())
{
using (session.BeginTransaction())
{
var result = session.CreateCriteria<User>()
.SetProjection(PublishedUserProjections)
.AddOrder(Order.Desc("XP"))
.SetMaxResults(count)
.SetResultTransformer(Transformers.AliasToBean<User.PublishedInfo>())
.List<User.PublishedInfo>();
foreach (var r in result)
r.Initialize();
session.Transaction.Commit();
return result; // this line
}
}
}
什麼可以可能錯在這裏?
UPDATE
有時在相同的代碼片段(但在調用BeginTransaction)我收到一個異常「超時而獲取連接」。也許這有點相關。
難道是因爲有時會話中的事務並沒有完全初始化,然後''使用''塊與'session.BeginTransaction()'裏面試圖處置一些實際上不存在的東西?簡而言之,我會嘗試初始化此塊中的事務變量,並僅在它不爲空時才提交它。此外,當發生交易事件以外的錯誤時會發生什麼?我無法在任何地方看到任何回滾... –
@WillMarcouiller「發生交易事件之外的錯誤時會發生什麼?」我不在乎,因爲只有閱讀操作。 「有時候會話中的事務根本沒有初始化」 - 比在進入使用塊之前應該拋出異常。 「只有當它不爲空時才提交它。」 NullReference不在我的代碼中。它在調用ISession.Dispose時拋出。 – Vlad
我明白了。但是,如果只讀取,爲什麼首先調用'BeginTransaction'方法?如果我相信該方法的名稱,我將它作爲'GetUsersByXP'說,它只從底層數據庫讀取。這裏沒有必要進行交易。此外,練習是分配一個變量,該變量將被放置在使用塊中,然後.NET知道要處理什麼。在這裏,正如我所看到的那樣,我猜測自從調用'BeginTransaction'方法以來,在處理會話時會出現某種混淆,並且沒有特別引用該事務。 –