Транзакция Nhibernate блокирует табель

Я разработал API WCF, который использует nHibernate. Я новичок в этом. Я использовал session.update, чтобы позаботиться о транзакции. У меня есть цикл, в котором на основе условия выбора я обновляю запись, т.е. Если A присутствует в tabel1, я обновляю таблицу, вставляя новую запись.

Я получаю сообщение "Не удалось выполнить запрос". при попытке выполнить запрос на выборку для таблицы, которая ранее обновлялась путем добавления новой записи в таблицу.

Я думаю, потому что я использую session.save(table1), а затем пытаюсь выбрать записи из этой таблицы, я получаю ошибку. Поскольку 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, если, скажем, для i=2 значение присоединения обнуляется, что я ввожу новую запись в таблицу присоединения. Тогда для i=3, когда он входит в функцию checkCV, я получаю ошибку в этой строке:

IList lstCandidateAttachment = CandidateAttachmentManager.GetByfkCandidateId (CandidateId);

Я думаю, это потому, что, поскольку я использую session.save, а затем пытаюсь прочитать содержимое таблицы, я не могу выполнить запрос, и таблица заблокирована, пока я не завершу сеанс. Между beginTransaction и commit таблица, связанная с объектом, заблокирована. Как мне этого добиться? Есть идеи?

Обновление: я прочитал некоторые из поста. Похоже, мне нужно установить уровень изоляции для транзакции. Но даже после добавления это не похоже на работу. Вот как я пытался это дополнить:

 using (ITransaction tranx = session.BeginTransaction(IsolationLevel.ReadUncommitted))
 {
     saveDocument();
 }

1 ответ

Что -то, чего я не понимаю в вашем коде, - это то, где вы получаете сеанс 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()

Надеюсь, что это поможет вам решить вашу проблему.

Не стесняйтесь давать более подробную информацию

Другие вопросы по тегам