Optimistic Locking

78 views
Skip to first unread message

wholegroup

unread,
Jul 23, 2010, 4:47:31β€―AM7/23/10
to ruGrails
ΠŸΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с оптимистичными Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ.

ΠŸΡ€ΠΎΡΡ‚Π°Ρ модСль для тСстирования:
class Registration
{
Date dateRequest;
}

Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° запись с id = 1


1) Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:

def testOne = {
def one = Registration.get(1);
def two = Registration.get(1);

one.dateRequest = new Date();
one.save(flush: true);

sleep(1000);

two.dateRequest = new Date();
two.save(flush: true);
}

По ΠΌΠΎΠ΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠ΅ Π½Π° строкС two.save Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ exception, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ
ΠΏΡ€ΠΈ one.save ΠΏΠΎΠ»Π΅ `version` Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈ
Π΄Π°Π½Π½Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΡƒΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΌΠΈ.

2) ΠšΡƒΡ‡Ρƒ Π½Π΅ понятных exception, хотя Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ (судя
ΠΏΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ http://www.grails.org/doc/latest/guide/single.html#5.3.5
Pessimistic and Optimistic Locking)

def testTwo
{
def existReg = Registration.get(1);

if (params.test)
{
sleep(5000);
}

try
{
existReg.dateRequest = new Date();
existReg.save(flush: true);
}
catch(org.springframework.dao.OptimisticLockingFailureException e)
{
}

}

Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:
* /site/testTwo?test=1 (ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ запись ΠΈ засыпаСт Π½Π° 5 сСкунд)
* /site/testTwo (ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ запись, измСняСт, сохраняСт ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ)

Π”Π°Π»Π΅Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ запрос Ρ‡Π΅Ρ€Π΅Π· 5 сСкунд ΠΏΡ€ΠΈ сохранСнии отваливаСтся с
ошибками:

Error 500: Object of class [Registration] with identifier [1]:
optimistic locking failed; nested exception is
org.hibernate.StaleObjectStateException: Row was updated or deleted by
another transaction (or unsaved-value mapping was incorrect):
[Registration#1]
Servlet: grails
URI: /app/grails/site/testTwo.dispatch
Exception Message: Row was updated or deleted by another transaction
(or unsaved-value mapping was incorrect): [Registration#1]
Caused by: Object of class [Registration] with identifier [1]:
optimistic locking failed; nested exception is
org.hibernate.StaleObjectStateException: Row was updated or deleted by
another transaction (or unsaved-value mapping was incorrect):
[Registration#1]
Class: Unknown

ΠšΡ‚ΠΎ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с оптимистичными Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ ? И Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ?

Sergey Dolgopolov

unread,
Jul 23, 2010, 5:00:48β€―AM7/23/10
to ruGrails
По ΠΏΠΎΠ²ΠΎΠ΄Ρƒ 1)
Всё ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Ρ‚.ΠΊ. послС выполнСния ΠΊΠΎΠ΄Π°

def one = Registration.get(1);
def two = Registration.get(1);
ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ one ΠΈ two ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΊΠΎΠ΄
выполняСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Hibernate-сСссии
Π—Π΄Π΅ΡΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π½Π΅Ρ‚ ΠΈ Π² ΠΏΠΎΠΌΠΈΠ½Π΅.

Sergey Dolgopolov

unread,
Jul 23, 2010, 5:07:58β€―AM7/23/10
to ruGrails
По ΠΏΠΎΠ²ΠΎΠ΄Ρƒ 2)

Π― написал Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ:

http://develosaur.ru/article/%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8-%D0%B2-grails-%D0%BD%D0%B0-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B5

ig78

unread,
Jul 23, 2010, 7:57:49β€―AM7/23/10
to ruGrails
Π’ вашСм случаС Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ДВА ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ:
1. Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° со стороны jvm
2. Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° со стороны hibernate.

ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ "засыпаСтС", Ρ‚ΠΎ jvm, Ρ‚ΠΎΡ‡Π½Π΅Π΅ Π΅Π΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ всС
созданныС Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС исполнСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
случайно Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΠ». Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя hibernate - это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ
ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ "кухня", которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ своим ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ,
управляя ΠΌΠ΅Π½Π΅Π΄ΠΆΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ Π² Π•Π• Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ
(синхронизация Π΄Π°Π½Π½Ρ‹Ρ… с Π±Π°Π·ΠΎΠΉ...), Ρ‚.Π΅. управляя Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ сСссиСй. Π’ΠΎΡ‚
Ρƒ вас ΠΈ получаСтся Ρ‡Ρ‚ΠΎ hibernate-кухня ломится ΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π½Π°
ΡƒΡ€ΠΎΠ²Π½Π΅ jvm ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ (ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ hibernate -
http://java-money.blogspot.com/2009/10/hibernate.html).

Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:
1. ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ послС sleep (ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π²Π°ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅
ΠΌΠ΅ΡˆΠ°Π΅Ρ‚)
2. ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваш exitReg срСдствами hibernate (Ρ‚ΠΎΡ‡Π½ΠΎ Π½Π΅
помню, Π½ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ exitReg.lock())

Π° Π²ΠΎΠΎΠ±Ρ‰Π΅ Π·Π°ΡΡ‹ΠΏΠ°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ - это ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.
ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ максимально быстро, ΠΈΠ½Π°Ρ‡Π΅ Ρƒ вас Π±ΡƒΠ΄Π΅Ρ‚
ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ hibernate-сСссии ΠΈ ΠΏΡ€ΠΈ ΠΌΠ°Π»ΠΎ-ΠΌΠ°Π»ΡŒΡΠΊΠΈΡ… Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°Ρ… (ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…
Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ссылкС) Ρ€Π΅Π·ΠΊΠΎ ΡƒΠΏΠ°Π΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
Π΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ


On Jul 23, 11:47Β am, wholegroup <wholegr...@gmail.com> wrote:
> ΠŸΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с оптимистичными Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ.
>
> ΠŸΡ€ΠΎΡΡ‚Π°Ρ модСль для тСстирования:
> class Registration
> {
> Β  Β  Β  Β  Date dateRequest;
>
> }
>
> Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° запись с id = 1
>
> 1) Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:
>
> def testOne = {
> Β  Β  Β  Β  def one = Registration.get(1);
> Β  Β  Β  Β  def two = Registration.get(1);
>
> Β  Β  Β  Β  one.dateRequest = new Date();
> Β  Β  Β  Β  one.save(flush: true);
>
> Β  Β  Β  Β  sleep(1000);
>
> Β  Β  Β  Β  two.dateRequest = new Date();
> Β  Β  Β  Β  two.save(flush: true);
>
> }
>
> По ΠΌΠΎΠ΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠ΅ Π½Π° строкС two.save Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ exception, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ
> ΠΏΡ€ΠΈ one.save ΠΏΠΎΠ»Π΅ `version` Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈ
> Π΄Π°Π½Π½Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΡƒΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΌΠΈ.
>
> 2) ΠšΡƒΡ‡Ρƒ Π½Π΅ понятных exception, хотя Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ (судя

> ΠΏΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈhttp://www.grails.org/doc/latest/guide/single.html#5.3.5

wholegroup

unread,
Jul 27, 2010, 2:36:43β€―PM7/27/10
to ruGrails

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для тСстирования Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π² Grails.
ΠŸΠΎΠΏΡ€ΠΎΠ±Ρ‹Π²Π°Π» Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ sleep Π΄ΠΎΠ»Π³ΠΈΠΌ пустым Ρ†ΠΈΠΊΠ»ΠΎΠΌ, Π½ΠΎ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ. ВсС
Ρ€Π°Π²Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ отлавливаСтся. Π’.Π΅. ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
org.springframework.dao.OptimisticLockingFailureException ΠΏΠΎ
Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ отлавливаСтся, Π½ΠΎ grails всС Ρ€Π°Π²Π½ΠΎ Π²Ρ‹ΠΊΠΈΠ΄Ρ‹Π²Π°Π΅Ρ‚
StaleObjectStateException, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΆΠ΅ Π½Π΅ отлавливаСтся (Ρ‚.Π΅.
catch(org.hibernate.StaleObjectStateException e){} Π½Π΅ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚) ΠΈ
Π² ΠΈΡ‚ΠΎΠ³Π΅ grails Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ 500 ΠΎΡˆΠΈΠ±ΠΊΡƒ.

ΠŸΠ΅ΡΡΠΈΠΌΠΈΡΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ .lock() Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚. Но Ρ‚.ΠΊ. Π² MySQL
Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записи SELECT FOR UPDATE Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΌ
autocommit'Π΅ (Π° ΠΎΠ½ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½), Ρ‚ΠΎ ΠΊΠΎΠ΄ Π½Π°Π΄ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π²
Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Model.withTransaction{}.

БСйчас всС Ρ‚Π°ΠΊΠΈ хочСтся Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с оптимистичСскими Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ.
Π‘Π΅Ρ€Π³Π΅ΠΉ, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ врСмя, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΉ ΠΊΠΎΠ΄ Π½Π°
ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ? Π’.ΠΊ. логичСски всС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.
Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² старых вСрсиях Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΈ сСйчас Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ сломалось.

wholegroup

unread,
Jul 27, 2010, 2:39:26β€―PM7/27/10
to ruGrails
Π― сСйчас ΠΏΠΎΠ΄ΡƒΠΌΠ°Π», Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΊΠΎΠ΄ Π²
catch(org.springframework.dao.OptimisticLockingFailureException e){}.
Вопрос Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊΠΎΠΉ?!

wholegroup

unread,
Jul 28, 2010, 11:51:13β€―AM7/28/10
to ruGrails
Разобрался с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ.
ПослС попадания в
org.springframework.dao.OptimisticLockingFailureException Π½ΡƒΠΆΠ½ΠΎ
ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ hibernate сСссию, ΠΈΠ½Π°Ρ‡Π΅ производится повторная ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°
обновлСния элСмСнта.
Код для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ exception оптимистичСских Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½
Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ:

registration.withSession { session ->


try
{
existReg.dateRequest = new Date();
existReg.save(flush: true);
}
catch(org.springframework.dao.OptimisticLockingFailureException e)
{

session.clear();
}
}

Π­Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΈ соотвСтствуСт Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π΅ совсСм
ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ (ΠΈΠ»ΠΈ "ΡΠΌΠΎΡ‚Ρ€ΡŽ Π² ΠΊΠ½ΠΈΠ³Ρƒ, Π²ΠΈΠΆΡƒ Ρ„ΠΈΠ³Ρƒ" ;).

Reply all
Reply to author
Forward
0 new messages