проблема в удалении записи - PullRequest
0 голосов
/ 08 января 2011

У меня есть менеджер сущностей em1 .em1 начинает транскрипцию tx на db1 table1.На данный момент внутри tx я вызываю API getdata (). Этот API создает новый сущность emmanger и возвращает 1 запись. Теперь, если менеджер сущностей em1 пытается удалитьзапись, возвращаемая em1, зависает. Время ожидания истекает. Запись заблокирована em1.Как можно решить эту проблему?

create em1
//em1 start transcation tx1
tx1.start
Object r = getData();
em1 tried to delete r //code hangs here
tx1.commit


Object getData(){
create em2
return data found using em2
}

Ответы [ 2 ]

0 голосов
/ 08 января 2011

Не создавайте em2. Передайте em1 в качестве параметра методу getData(). При этом вы используете только один em1.

Я точно не знаю, но кажется, что em1 устанавливает блокировку для связанной таблицы, поэтому вы ничего не можете сделать снаружи.

0 голосов
/ 08 января 2011

Из вашего вопроса не ясно, имеет ли запись EM2 какое-либо отношение к таблицам, включенным в EM1. Если так, то это может быть потому, что EM2 не был закрыт. Обратите внимание, что даже события «select» включают транзакции. Итак, я бы сказал, что первым делом было бы добавить явное разграничение транзакций в EM2. Неявные транзакции на самом деле не очень хорошая вещь, и в зависимости от используемой вами базы данных и уровней изоляции базовая база данных может ожидать завершения неявной транзакции EM2, вызывая мертвую блокировку в вашем коде.

Мое предложение:

Object getData(){
  create em2
  tx2.start
  get record 
  tx2.commit
  close em2
  return record
}

В качестве хорошей практики старайтесь всегда явно начинать и совершать транзакции, даже в целях чтения. Помните, что даже если вы не укажете транзакцию, ваша база данных будет запускаться неявно.

...