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事务锁定一个表

我在您的代码中不明白的是,从哪里可以获得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()

希望这能帮助你解决问题。

请随时提供更多详细信息