Nhibernate事务锁定一个表
本文关键字:一个 事务 锁定 Nhibernate | 更新日期: 2023-09-27 17:57:36
我已经开发了一个使用nHibernate的WCF api。我是新手。我已经使用session.update来处理事务。我有一个for循环,在这个循环中,根据选择条件,我更新一个记录,即如果表1中存在a,那么我更新表,否则插入一个新条目。
当试图对表执行选择查询时,我得到"无法执行查询。",该表以前是通过在表中添加新条目来更新的。
我的想法是,因为我正在使用session.save(表1),然后尝试从该表中选择条目,所以我遇到了一个错误。由于session.save临时锁定了表,因此我无法对该表执行选择查询。
对此有什么解决方案?
更新:这是我用来在数据库中检查某些字段的for循环:
using (ITransaction tranx = session.BeginTransaction())
{
savefunction();
tranx.Commit();
}
保存功能:
public void savefunction()
{
for (int i = 0; i < dictionary.Count; i++)
{
ICandidateAttachmentManager candidateAttach = new ManagerFactory().GetCandidateAttachmentManager();
CandidateAttachment attach = new CandidateAttachment();
attach = checkCV();
if(attach == null)
{
//insert new entry into table attach
session.save(attach);
}
}
}
checkCV函数:
public void checkCV()
{
using (ICandidateAttachmentManager CandidateAttachmentManager = new ManagerFactory().GetCandidateAttachmentManager())
{
IList<CandidateAttachment> lstCandidateAttachment = CandidateAttachmentManager.GetByfkCandidateId(CandidateId);
if (lstCandidateAttachment.Count > 0)
{
CandidateAttachment attach = lstCandidateAttachment.Where(x => x.CandidateAttachementType.Id.Equals(FileType)).FirstOrDefault();
if (attach != null)
{
return null;
}
else
{
return "some string";
}
}
}
}
这里发生的事情是在for循环中,如果说for i=2,则附加值变为null,表示我正在向附加表中输入新条目。然后对于i=3,当它进入checkCV函数时,我在这一行得到一个错误:
IList lst候选日期附件=CandidateAttachmentManager.GetByfkCandidateId(CandidateId);
我认为这是因为我使用session.save,然后试图读取tabel内容,所以我无法执行查询,并且表被锁定,直到我提交会话。在beginTransaction和提交之间,与对象关联的表被锁定。我怎样才能做到这一点?有什么想法吗?
更新:我读了一些帖子。看起来我需要为事务设置隔离级别。但即使添加后,它似乎也不起作用。以下是我试图修复它的方法:
using (ITransaction tranx = session.BeginTransaction(IsolationLevel.ReadUncommitted))
{
saveDocument();
}
我在您的代码中不明白的是,从哪里可以获得nHibernate会话。
事实上,你使用
new ManagerFactory().GetCandidateAttachmentManager();
和
using (ICandidateAttachmentManager CandidateAttachmentManager = new ManagerFactory().GetCandidateAttachmentManager())
那么您的ManagerFactory类为您提供了ISession?
然后你做:
CandidateAttachment attach = new CandidateAttachment();
attach = checkCV();
但是
checkCV() returns either a null or a string ?
最后,你永远不应该做
Save()
而是
SaveOrUpdate()
希望这能帮助你解决问题。
请随时提供更多详细信息