ΠΡΠΎΡΡΠ°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
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
ΠΡΠΎ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΠΏΡΠΈΠΌΠΈΡΡΠΈΡΠ½ΡΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°ΠΌΠΈ ? Π ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ?
Π― Π½Π°ΠΏΠΈΡΠ°Π» Π½Π΅Π±ΠΎΠ»ΡΡΡΡ ΡΡΠ°ΡΡΡ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ:
ΠΊΠΎΠ³Π΄Π° Π²Ρ "Π·Π°ΡΡΠΏΠ°Π΅ΡΠ΅", ΡΠΎ 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
ΠΠ΅ΡΡΠΈΠΌΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ .lock() ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠΎ Ρ.ΠΊ. Π² MySQL
Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ SELECT FOR UPDATE Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΠΎΠΌ
autocommit'Π΅ (Π° ΠΎΠ½ ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ΅Π½), ΡΠΎ ΠΊΠΎΠ΄ Π½Π°Π΄ΠΎ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡ Π²
ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Model.withTransaction{}.
Π‘Π΅ΠΉΡΠ°Ρ Π²ΡΠ΅ ΡΠ°ΠΊΠΈ Ρ
ΠΎΡΠ΅ΡΡΡ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ ΠΎΠΏΡΠΈΠΌΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°ΠΌΠΈ.
Π‘Π΅ΡΠ³Π΅ΠΉ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ Π²ΡΠ΅ΠΌΡ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠΉ ΠΊΠΎΠ΄ Π½Π°
ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ? Π’.ΠΊ. Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, Π½ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² ΡΡΠ°ΡΡΡ
Π²Π΅ΡΡΠΈΡΡ
ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ ΠΈ ΡΠ΅ΠΉΡΠ°Ρ ΡΡΠΎ-ΡΠΎ ΡΠ»ΠΎΠΌΠ°Π»ΠΎΡΡ.
registration.withSession { session ->
try
{
existReg.dateRequest = new Date();
existReg.save(flush: true);
}
catch(org.springframework.dao.OptimisticLockingFailureException e)
{
session.clear();
}
}
ΠΡΠΎ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π½ΠΎ Π±ΡΠ»ΠΎ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ
ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ (ΠΈΠ»ΠΈ "ΡΠΌΠΎΡΡΡ Π² ΠΊΠ½ΠΈΠ³Ρ, Π²ΠΈΠΆΡ ΡΠΈΠ³Ρ" ;).