2011-01-08 4 views
0

У меня есть менеджер объектов em1 .em1 запускает транскрипцию tx в таблице db1. Теперь внутри tx я вызываю API getdata(). Этот API создает новый объект entitymanger em2 и возвращает 1 запись. Теперь, если сущность manger 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 
} 
+0

Является ли это OpenJPA или Hibernate? – Rick

ответ

0

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

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

0

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

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

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

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

Смежные вопросы