有个问题困扰了好久:
同样的程序,有时成功有时失败,怀疑和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;
}
}
{
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,而没有用旧的。
有高手指教一下??