Транзакция 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()
Надеюсь, что это поможет вам решить вашу проблему.
Не стесняйтесь давать более подробную информацию