Pessimistic Locking vs. Optimistic Locking
λκ΄μ μΈ λ½, λΉκ΄μ μΈ λ½.
λ€μ΄κ°κΈ° μ μ,
μλ§λ λ½μ λν μ²λ¦¬λ₯Ό μ΄λ»κ² ν μ§μ λν κ°λ μΌλ―.
λ½μ λν΄ λκ΄μ μΌλ‘ μκ°νλλ, λ½μ λν΄ λΉκ΄μ μΌλ‘ μκ°νλλλ‘ μ΄ν΄λ¨.
About
λκ°μ§ λͺ¨λ Lockμ μ΄λ»κ² λ€λ£° κ²μΈκ°μ λν λͺ¨λΈ
λ°μ΄ν°λ² μ΄μ€ κΈ°λ³Έ κΈ°λ₯μ μλλ―. μ¦ λ°μ΄ν°λ² μ΄μ€μμ κΈ°λ³Έμ μΌλ‘ λκ΄μ μΈ λ½ νΉμ λΉκ΄μ μΈ λ½μ μ¬μ©νκ² λ€κ³ μ ννλ μ΅μ μ μλλ―.
λ¨μ§ κ°λ μ μΌλ‘λ λ½(Lock)μ λ°λΌλ³΄λ κ΄μ
λκ΄μ μΈ λ½
λΉμ μ μ κΈ.
λ³κ²½ μ¬νμ΄ λ°μ΄ν°λ² μ΄μ€μ 컀λ°λ λλ§ λ μ½λκ° μ κΈΈ κ²μ.
λ½μ λν΄ μ‘°κΈ λμ¨νκ² λ°λΌλ³΄λ λ―, νΈλμμ κ°μ΄ μΆ©λμ΄ λ°μνμ§ μμ κ².
μ¦ λ½ μ€μ μ λ¬Έμ κ° μμ κ±°λ€!
λ³κ²½μ¬νμ΄ μμ΄λ, μμ§ μ»€λ°μ΄ μλμμΌλ©΄ μ 겨μμ§ μμλ―.
λΉκ΄μ μΈ λ½
μ μ μ κΈ
λ μ½λκ° λ³κ²½μ΄ λκ³ μλ€λ©΄, μ 겨μμ κ±°μ. μ¦ Lockμ΄ κ±Έλ € μμ κ².
νΈλμμ κ° μΆ©λμ΄ μΌμ΄λ κ²μ΄λΌ μκ°νκ³ (λΉκ΄μ ), λ½μ μ’ λ―Έλ¦¬ λΉ‘μΈκ² κ±Έμ΄λλ λλ.
λκ΄μ μΈ λ½
보λ€λ μ’ λ μ격ν λλ.λ§μ½μ μ΄λ€ λ μ½λκ° μμ μ€μ΄λΌλ©΄ (μμ§ μ»€λ°μ΄ μλ μν) λ½μ΄ κ±Έλ €μμ κ±°λΌ κΈ°λνλ λͺ¨λΈμΈλ―.
Optimistic locking
physical, logcial μ μΌλ‘ ꡬνμ΄ κ°λ₯νλ―.
κ·Έλ μ§λ§ μ¬λ¬λͺ¨λ‘ Logicalμ μ¬μ©νλ κ² μ’ λ ν¨μ¨μ μΌλ‘ λ³Ό μ μμλ―
μ¦ Database μ체 Lock 보λ€λ, λ½ μ²λΌ ꡬνν (Logical) κ±Έ μ¬μ©νλκ² λ«λ€λ μλ―ΈμΈλ―.
κ·Έλμ μ κ·Έλ¦ΌμΌλ‘ 보면,
version
μ΄λΌλ 컬λΌμ ν΅ν΄, Logcial Lockμ ꡬν (JPAμμ..)commit μκ° version μ μ¦κ°μν΄μΌλ‘μ¨, λ€λ₯Έ Update λ¬Έμ
version = 1
μ‘°κ±΄μ΄ λμ΄μλ ꡬ문μ 무μλ¨μ μ μ μμ.μ΄λ΄ κ²½μ°
PreapredStatement
λ 0μ 리ν΄νκ³data access framework
(μλ₯Ό λ€λ©΄ JPA..?) μμλOptimisticLockException
μ λμ§.κ·Έλ΄ κ²½μ° Alice κ° μ§ννλ Transaction μ λ‘€λ°±λ¨.
μ μ©νλ €κ³ νλ updateλ¬Έμ λν μ λ³΄κ° μμ΄μ§λκΉ.. μ΄ λΆλΆμ λν μ²λ¦¬κ° application μμ νμν μ§λ..
In JPA
λ³΄ν΅ μν°ν°μ
@Version
νλλ₯Ό μ΄μ©ν΄μ μ¬μ©ν¨.κ·Έλμ μ λ°μ΄νΈ μ μ, ν΄λΉ νλλ₯Ό 체ν¬νλ λ°©μμ μ΄μ©
4κ°μ§ Lock Modeλ₯Ό μ 곡νκ³ μμ.
OPTIMISTIC
optimistic read lock
λΉμ μ λ½
ν΄λΉ λͺ¨λλ₯Ό μ¬μ©νλ©΄, dirty read or non-repeatable read κ° λ°μνμ§ μλλ‘ λ§μμ€.
μ¦ μ»€λ°λμ§ μμ λ°μ΄ν°λ₯Ό μ½λ κ²μ λ°©μ§νκ±°λ, ν νΈλμμ λ΄μμ κ°μ μΏΌλ¦¬κ° λ°λ³΅ μ€ν λ λ λμΌν κ°μ΄ λμ€λλ‘ μΌκ΄μ±μ 보μ₯ν΄μ€λ€λ λ§.
OPTIMISTIC_FORCE_INCREMENT
OPTIMISTIC λ₯Ό κΈ°λ°μΌλ‘, μΆκ°μ μΈ λ²μ Ό μ¦κ°λ entityκ° λ°νλ¨.
컀λ°μ΄λ νλ¬μ λκΈ° μ κΉμ§λ μλ¬κ° λ°μν μ§ νΉμ ν μ μμ.
READ
OPTIMISTICμ alias
WRITE
OPTIMISTIC_FORCE_INCREMENT μ alias
JPA μ€νμμλ READ, WRITE νμ μ μ¬μ©νκΈ° 보λ€λ 1,2λ² μ²λΌ λͺ μμ μΈ νμ μ μ¬μ©νλκ±Έ κΆμ₯νλ λ―.
λ°μν μ μλ μλ¬
OptimisticLockException
ν΄λΉ μλ¬κ° λμ Έμ‘μ λ, νμ¬ νΈλμμ μ rollback onlyλ‘ markλ¨.
λ³΄ν΅ μ΄ μλ¬λ, λ€μ μν°ν°λ₯Ό μ‘°ννκ±°λ (μλ‘μ΄ νΈλμμ μΌλ‘), κ·Έ νμ μ λ°μ΄νΈ νλλ‘ κΆμ₯λ¨.
μ 리νμλ©΄..
κΈ°λ³Έμ μΌλ‘ JPAμμλ OPTIMISTIC, OPTIMISTIC_FORCE_INCREMENT νμ μ΄ μ 곡λκ³ μμ.
μ¬μ©λ°©λ²μ
Query
μΈν°νμ΄μ€μμ μ§μ νκ±°λ, μν°ν°λ§€λμ λ₯Ό ν΅ν΄ μ΄μ©νλ λ°©λ²λ μλλ―.κ·Έλ¦¬κ³ λ³΄ν΅ μλ¬ λ°μνλ©΄, μΆκ°μ μΌλ‘ μ΄ν리μΌμ΄μ μμ νΈλ€λ§μ΄ νμν κ²μΌλ‘ 보μ΄κ³ .
λ°μ΄ν°λ² μ΄μ€μμ μ 곡νλ λ½ (s lock, x lock) μ μ¬μ©νλ κ²μ΄ μλλ―λ‘, deadlockκ°μ μν©μ΄ λ°μνμ§ μμ κ² κ°μ.
Pessimistic lock
λΉκ΄μ μΈ λ½
μ¦ λ½μ΄ 걸릴 κ²μ μμνκ³ , 미리 λ½μ μ μ ν¨.
νλμ λ μ½λμ λμμ μ λ°μ΄νΈκ° λλ κ²μ λ§κΈ° μν΄ μ¬μ©λ¨.
μ΄λ€ μ μ κ° μ΄λ€ λ μ½λμ μ λ°μ΄νΈλ₯Ό μ€ννλ©΄, ν΄λΉ λ μ½λμλ λ½μ΄ κ±Έλ¦¬κ³ , μ΄ λ½μ΄ νμ΄μ§κΈ° μ (μ΄ μ μ μ μ 컀λ°μ΄ μλ£λ λ κΉμ§) μλ λ€λ₯Έ μ μ κ° ν΄λΉ λ μ½λμ μ λ°μ΄νΈλ₯Ό μ€νν μ μμ.
Shared, Exclusive lock..
μ€μ§μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€μμ ν΄λΉ νμ λ½μ 건λ€κ³ μ΄ν΄λ¨.
λ½μ΄ κ±Έλ €μμ ν λ, μΆ©λμ λ°©μ§ν μ μμ.
νΈλμμ κ° μΆ©λμ μλ°©ν μ μμ.
κ·Έλ μ§λ§ μ±λ₯μ μΌλ‘λ λ³λ‘ μ μ’μ§ μμκΉ? (λ½μ κ±Έκ³ , νμΈνκ³ νΉμ νΈλ κ² μμ²΄κ° κ½€ 리μμ€κ° μλͺ¨λμ§ μμκΉ μκ°λ¨.)
μ? λ½μ κ±Έκ³ , νκ³ , νΉμ λ€λ₯Έ νΈλμμ μμ ν΄λΉ λ μ½λμ λ½μ΄ κ±Έλ €μλ μ§ νμΈνλ μμ μ΄ νμν ν λ..
μ 첨λΆλ κ·Έλ¦Όμ 보면, Bobμ UPDATE ꡬ문μ νΈλμμ λ½μ, Alice μ 컀λ°μ΄ μλ£λκΈ° μ κΉμ§λ νλν μ μμ.
κ·Έλ°λ° λ§μ½μ Aliceκ° commitμ΄ μ΄λ€ μ΄μ μμ κ·Έλ°μ§ λλμ§ μλλ€λ©΄..?
μΌμ μκ°μ΄ μ§λλ©΄ Dead Lock κ°μκ² λ°μνμ§ μμκΉ?
In JPA
3κ°μ§ LOCK MODE νμ μ μ 곡νκ³ μμ.
PESSIMISTIC_READ
shared lock
(s lock) μ¬μ©. κ·Έλμ ν΄λΉ rowμ update or deleteλ₯Ό λ°©μ§ν¨.dirty read
λ₯Ό λ°©μ§νκΈ° μν΄μ μ¬μ©ν¨.PESSIMISTIC_WRITE
exclusive lock
(x lock) μ¬μ©. read, update, deleted λͺ¨λ λ§μμ¦ read, update, delete actionμ νκΈ° μν΄μλ 무쑰건 ν΄λΉ λ½μ νλν΄μΌλ¨.
λ¨ μ΄λ€ λ°μ΄ν°λ² μ΄μ€λ ν΄λΉ λ½μ μ¬μ©νκ³ μμ΄λ, read ν μ μλλ‘ μ§μν΄μ£Όλ λ― (MVCC)
PESSIMISTIC_FORCE_INCREMENT
PESSIMISTIC_WRITE
λ₯Ό κΈ°λ°μΌλ‘ entityμ version νλλ₯Ό μ΄μ©ν΄ λ²μ Έλ κΈ°λ₯λ μ§μ@Version
μ¬μ©update μμ, λ½ (x lock) νλμ΄ νμν λμμ, version νλμ 맀μΉλ νμν¨ (μ’ λ μμ νλ―.)
λ°μν μ μλ μλ¬
PessimisticLockException
LockTimeoutException
PersistanceException
μ μλ¬λ€μ νμ¬ νΈλμμ μνλ₯Ό rollback only μνλ‘ λ§λ€μ΄λμ.
Lock Timeout μ ν
LockTimeoutException
λ°μμ μν΄ μ€μ μ΄ νμνλ―.javax.persistence.lock.timeout
μ κ°μ μ΄μ©νλ λ°, λ¨μλ millisecondsλ°μ΄ν°λ² μ΄μ€κ° ν΄λΉ μ ν μ μ§μνμ§ μλ κ²½μ°λ μμΌλ, νμΈμ΄ νμν¨.
μ 리νμλ©΄..
μ¬λ¬ νΈλμμ μμ, κ°μ 리μμ€μμ κ°μ νμμ μ κ·Όνμ§ μλλ‘ λ°μ΄ν°λ² μ΄μ€ μ°¨μμμ λ½μ μ΄μ©ν΄μ ν΄κ²°νλ λ°©λ²μ μ§μν΄μ€.
μ¬μ©λ°©λ²μ μμμ μΈκΈν κ²κ³Ό λΉμ· (
Query
, μν°ν°λ§€λμ ...λ±λ±)λ°μ΄ν°λ² μ΄μ€μ λ½μ μ¬μ©νλ, deadlockμ΄ λ°μν μλ μκ² κ³ , μ΄λ¬ν μν©μ λμ²νκΈ° μν΄μ
timeout
μ€μ μ΄ νμμ μΌλ‘ 보μ.
μΆκ°μ μΈ ν€μλ
Shared Lock, Exclusive Lock
Isolation Level
MVCC
Dead Lock
μ°Έκ³
Last updated
Was this helpful?