может ли возникать OptimisticLockException, если уровень изоляции приложения srv установлен на READ COMMITTED? - PullRequest
1 голос
/ 08 октября 2010

Я использую сервер приложений Websphere 7.0.0.0.9 с; OpenJPA 1.2.3-SNAPSHOT '. У меня есть свойство Set источника данных jdbc webSphereDefaultIsolationLevel = 2 (READ COMMITTED). У меня есть этот вопрос, потому что я понимаю, что OptimasticLockException возникает, если есть гонка для фиксации одной и той же строки несколькими потоками. Но я думаю, что такая ситуация никогда не должна возникать, если для сервера приложений уровня изоляции установлено значение READ COMMITTED.

Это исключение, которое я получаю ..

<openjpa-1.2.3-SNAPSHOT-r422266:907835 fatal store error> org.apache.openjpa.persistence.OptimisticLockException: An optimistic lock violation was detected when flushing object instance 

1 Ответ

1 голос
/ 09 октября 2010

У меня есть этот вопрос, потому что, как я понимаю, OptimisticLockException происходит, если существует гонка для фиксации одной и той же строки несколькими потоками.

Да, OptimisticLockException будет выброшено, если атрибут Version сущности выше (то есть был изменен другой транзакцией) во время фиксации, чем когда он был прочитан. Это показано на рисунке ниже (заимствовано из JPA 2.0 Параллелизм и блокировка ):

alt text

Но я думаю, что такая ситуация никогда не должна возникать, если для сервера приложений уровня изоляции установлено значение READ COMMITTED.

Почему? При использовании уровня изоляции READ COMMITTED может произойти неповторяемое чтение , но:

  1. Это не повлияет на представление данных в памяти (e1 в приведенном выше примере)
  2. Большую часть времени вы не перечитываете данные
    • И даже если вы делаете (и выполняете неповторяющееся чтение), сущность все еще может быть изменена другим потоком, прежде чем вы внесете изменения.

Подводя итог, READ COMMITTED не помешает OptimisticLockException.

...