Я немного смущен преимуществами оптимистической блокировки в JPA.Оптимистическая блокировка предотвращает блокировку в JPA?
Я проверил тест с двумя потоками и одной строкой на версии таблицы сущностей.
Вот что я нашел:
T1: begin tran
T1: fetch single entity
T1: Update field in entity
T1: sleep
T2: begin tran
T2: fetch single entity
T2: Update field in entity
T2: commit trans
T1: wake up
T1: commit trans - throws OptimisticLockException (expected)
Второй тест. Обратите внимание на добавление оператора select.
T1: begin tran
T1: fetch single entity
T1: Update field in entity
T1: run select query on table (this causes a DB transaction to begin)
T1: sleep
T2: begin tran
T2: fetch single entity (this blocks until DB transaction of thread T1 completes!)
T2: Update field in entity
T2: commit trans
T1: wake up
T1: commit trans - ok, no exception. The fetch/update/commit of T2 happened after T1 commit.
Я действительно не ожидал какие-либо блокировок возникает при использовании оптимистической блокировки, однако я понимаю, что транзакция базы данных должна быть на месте здесь, так что правильные данные возвращаются из отборного заявления.
Поскольку JPA только кажется, что вводит транзакции базы данных, когда это абсолютно необходимо, может ли кто-нибудь объяснить, какие преимущества оптимистической блокировки?
Я думаю, что меня смущает, что во втором примере выше, строка базы данных была заблокирована, как только транзакция базы данных была введена в. Это выглядело нечестно лучше, чем не оптимистичный случай. – Darren
Я не уверен, что оператор «строка базы данных была заблокирована, как только была введена транзакция базы данных» - это правда. Блокировка и транзакции - это отдельные механизмы. – digitaljoel
Да. Я имел в виду, что транзакция была запущена, и было сделано обновление строки, которая заставляет строку блокироваться все время открытия транзакции. Похоже, что даже оптимистичная блокировка может привести к блокировке строки в течение длительного периода времени, если она происходит внутри транзакции базы данных? – Darren