Будет ли javax.persistence.EntityManager.find возвращать значение null, если ему не удастся заблокировать строку?

Из javadoc он сказал: T find (Class entityClass, Object primaryKey) Найти по первичному ключу. Параметры: entityClass - primaryKey - Возвращает: экземпляр найденной сущности или ноль, если сущность не существует.

Когда ему не удается получить блокировку для записи, он также возвращает null?

В моей программе кажется, что null возвращается, когда он не может получить блокировку соответствующей строки.


person Yvonne Chu    schedule 27.01.2012    source источник
comment
Я не думаю, что find делает какую-либо блокировку.   -  person Don Roby    schedule 28.01.2012
comment
Когда я проверял журналы, это переводится как «Выбрать ... для обновления», разве это не означает блокировку?   -  person Yvonne Chu    schedule 30.01.2012
comment
Если он выбирает для обновления, то действительно я был неправ, и find действительно блокируется в JPA.   -  person Don Roby    schedule 30.01.2012
comment
Ну, однако, я обнаружил, что если я вызову собственный SQL Select... for Update Wait 30. Возможно, блокировка снимается слишком рано, прежде чем транзакция будет завершена.   -  person Yvonne Chu    schedule 30.01.2012


Ответы (1)


Когда EntityManager.find() не удается заблокировать строку, возникает исключение. Вот один из моих журналов, чтобы доказать это. В моем случае он пытается прочитать уже заблокированную запись и терпит неудачу через 20 секунд (OpenJPA 1.2.2 + Derby 10.6):

2011-10-14T16:33:22.882 [RemoteParameterStatusListenerInternalContainer-2] ERROR [c.v.r.r.i.g.RemoteParameterStatusInternalGatewayBean] - Exception in [...] org.apache.openjpa.persistence.OptimisticLockException: Unable to obtain an object lock on "DERBY SQL error: SQLCODE: -1, SQLSTATE: 40001, SQLERRMC: Lock : ROW, PRODUCTSTATUS, (389,56)
  Waiting XID : {225252, S} [...], [query here]
  Granted XID : {225234, X} 
Lock : ROW, PRODUCTSTATUS, (389,57)
  Waiting XID : {225234, S} [...]
person MaDa    schedule 07.02.2012
comment
Но как узнать, возникает ли исключение при выполнении SQL или из EntityManager.find()? - person Yvonne Chu; 09.02.2012
comment
Это всегда SQL внизу. Em.find() использует SQL для поиска записи. - person MaDa; 09.02.2012