有個問題困擾了好久:
同樣的程式,有時成功有時失敗,懷疑和ASP的線程有關係
程式:
public int Deposit(Guid AccountID, string sn)
{
decimal balance = 0;
int useDay = 0;
string business;
Account account =
(Account)_coreRepository.GetObjectById(typeof(Account),AccountID);
Guid snId;
GetSnID(sn,out snId);//調用Hql
if(ValidateSn(snId,out balance,out useDay,out business) == 0)//用到NH的HQL
{
//省略
_coreRepository.UpdateObject(account);
SetOperateLog("DepositBySn",balance.ToString(),"","",account);//用到Save
return 0;
}
}
else
{
return ValidateSn(snId,out balance,out useDay,out business);
}
}
_coreRespository的原始碼我的Blog上有,封裝了一些簡單的CRUD操作
以上代碼,昨天突然運行不正常,運行到GetSnID時出錯。可是單獨調用GetSnID能正常運行。懷疑是Session的問題,檢查Corespoitory的封裝,發現他沒有在每次操作中關閉Session而是讓HttpModuel來處理的。
可跟蹤程式發現Session是Open的,因此與Session的OPen,Close 無關
現在改代碼如下:public int Deposit(Guid AccountID, string sn)
{
decimal balance = 0;
int useDay = 0;
string business;
Account account = (Account)_coreRepository.GetObjectById(typeof(Account),AccountID);
Guid snId;
_coreRepository.CloseSession();
_coreRepository.OpenSession();
GetSnID(sn,out snId);
if(ValidateSn(snId,out balance,out useDay,out business) == 0)
{
_coreRepository.CloseSession();
_coreRepository.OpenSession();
ISession s = _coreRepository.ActiveSession;
s.Update(account);
s.Close();
if(_coreRepository.ActiveSession.IsOpen == false)
{
_coreRepository.OpenSession();
}
SetOperateLog("DepositBySn",balance.ToString(),"","",account);
//_coreRepository.CloseSession();
return 0;
}
}
能正常運行。
認為問題已經解決。
可是晚上再運行以前出問題的代碼(第一段),竟然又能正常工作了。
因為Session不是安全執行緒的,懷疑和Asp的線程有關。
第二段能解決問題,應該是再每次函數調用中都用到了新的Session,而沒有用舊的。
有高手指教一下??