MySQL 격리 μˆ˜μ€€

νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€(Isolation Level)μ΄λž€ μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— 처리될 λ•Œ νŠΉμ • νŠΈλžœμž­μ…˜μ΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ λ³€κ²½ν•˜κ±°λ‚˜ μ‘°νšŒν•˜λŠ” 데이터λ₯Ό λ³Ό 수 있게 ν—ˆμš©ν• μ§€ 말지λ₯Ό κ²°μ •ν•˜λŠ” 것이닀.

β€˜Dirty Read’라고도 ν•˜λŠ” Read UncommittedλŠ” 거의 μ‚¬μš©ν•˜μ§€ μ•Šκ³ , Serializable λ˜ν•œ λ™μ‹œμ„±μ΄ μ€‘μš”ν•œ DBμ—μ„œλŠ” 거의 μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

4개의 격리 μˆ˜μ€€μ—μ„œ μˆœμ„œλŒ€λ‘œ λ’€λ‘œ 갈수둝 νŠΈλžœμž­μ…˜ κ°„ 데이터 격리(고립) 정도가 λ†’μ•„μ§€λ©° λ™μ‹œμ„±λ„ λ–¨μ–΄μ§„λ‹€.

격리 μˆ˜μ€€μ΄ λ†’μ•„μ§ˆμˆ˜λ‘ MySQL μ„œλ²„μ˜ 처리 μ„±λŠ₯이 많이 λ–¨μ–΄μ§ˆ κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜λŠ”λ°, Serializable이 μ•„λ‹ˆλΌλ©΄ 크게 κ°œμ„ μ΄λ‚˜ μ €ν•˜κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

  • SQL-92, SQL-99 ν‘œμ€€μ— λ”°λ₯΄λ©΄ Repeatable Readμ—μ„œλŠ” Phantom Readκ°€ λ°œμƒν•  수 μžˆμ§€λ§Œ, InnoDBλŠ” λ…νŠΉν•œ νŠΉμ„±μœΌλ‘œ Repeatable Readμ—μ„œλ„ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

일반적인 DBλŠ” Read Committed와 Repeatable Read 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•œλ‹€.

Read Uncommitted

Read Uncommitted 격리 μˆ˜μ€€μ—μ„œλŠ” κ·Έλ¦Όκ³Ό 같이 νŠΈλžœμž­μ…˜μ—μ„œμ˜ λ³€κ²½ λ‚΄μš©μ΄ commit, rollback μ—¬λΆ€ 상관없이 λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ 보인닀.

μ‚¬μš©μž A νŠΈλžœμž­μ…˜μ—μ„œ insertλ₯Ό μˆ˜ν–‰ν•˜κ³  commit ν•˜κΈ° 전에, μ‚¬μš©μž Bμ—μ„œ μ‘°νšŒκ°€ κ°€λŠ₯ν•˜λ‹€. λ¬Έμ œλŠ” μ‚¬μš©μž A νŠΈλžœμž­μ…˜μ—μ„œ 둀백을 해도 μ—¬μ „νžˆ μ‚¬μš©μž B νŠΈλžœμž­μ…˜μ—μ„œλŠ” β€˜Lura’λ₯Ό μ‘°νšŒν•˜κ³  계속 μ²˜λ¦¬ν•œλ‹€λŠ” 점이닀.

μ΄λ ‡κ²Œ μ–΄λ–€ νŠΈλžœμž­μ…˜μ—μ„œ μ²˜λ¦¬ν•œ μž‘μ—…μ΄ μ™„λ£Œλ˜μ§€ μ•Šμ€ μƒνƒœλ₯Ό λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ λ³Ό 수 μžˆλŠ” ν˜„μƒμ„ 더티 λ¦¬λ“œ(Dirty Read)라고 ν•œλ‹€.

Read Uncommitted 격리 μˆ˜μ€€μ—μ„œ λ°œμƒν•˜λŠ” 더티 λ¦¬λ“œλŠ” 정합성에도 λ¬Έμ œκ°€ λ§Žλ‹€. κ·Έλž˜μ„œ MySQL을 μ‚¬μš©ν•œλ‹€λ©΄ μ΅œμ†Œν•œ Read Committed μ΄μƒμ˜ 격리 μˆ˜μ€€ μ‚¬μš©μ„ ꢌμž₯ν•œλ‹€.

Read Committed

Read CommittedλŠ” Oracle DBMSμ—μ„œ 기본으둜 μ‚¬μš©ν•˜λŠ” 격리 μˆ˜μ€€μ΄λ©°, 온라인 μ„œλΉ„μŠ€μ—μ„œ κ°€μž₯ 많이 μ„ νƒλ˜λŠ” 격리 μˆ˜μ€€μ΄λΌκ³  ν•œλ‹€. 더티 λ¦¬λ“œλŠ” λ°œμƒν•˜μ§€ μ•Šκ³  μ–΄λ–€ νŠΈλžœμž­μ…˜μ—μ„œ 데이터λ₯Ό λ³€κ²½ν•˜λ”λΌλ„ commit이 μ™„λ£Œλœ λ°μ΄ν„°λ§Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ‘°νšŒν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

μ‚¬μš©μž A νŠΈλžœμž­μ…˜μ—μ„œ 데이터λ₯Ό λ³€κ²½ν–ˆλŠ”λ°, μƒˆλ‘œμš΄ 값은 ν…Œμ΄λΈ”μ— μ¦‰μ‹œ 기둝되고 이전 값은 언두 μ˜μ—­μœΌλ‘œ λ°±μ—… λœλ‹€. 데이터λ₯Ό λ³€κ²½ν•œ νŠΈλžœμž­μ…˜μ—μ„œ 컀밋을 μˆ˜ν–‰ν•˜κΈ° μ „, λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ‘°νšŒν•˜λ©΄ 이전 값이 μ‘°νšŒλœλ‹€.

  • κ·Έλ¦Όμ—μ„œ μ‚¬μš©μž B 같은 κ²½μš°μ—λŠ” 원본 ν…Œμ΄λΈ”μ΄ μ•„λ‹Œ 언두 μ˜μ—­μ— λ°±μ—…λœ λ ˆμ½”λ“œλ₯Ό κ°€μ Έμ˜¨ 것이닀.

Read Committed 격리 μˆ˜μ€€μ—μ„œλŠ” μ–΄λ–€ νŠΈλžœμž­μ…˜μ—μ„œ λ³€κ²½ν•œ λ‚΄μš©μ΄ 컀밋 되기 μ „κΉŒμ§€λŠ” λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ λ³€κ²½ 내역을 μ‘°νšŒν•  수 μ—†λ‹€. 이 격리 μˆ˜μ€€μ—μ„œλ„ β€œNon-Repeatable Readβ€λΌλŠ” λΆ€μ •ν•©μ˜ λ¬Έμ œκ°€ μžˆλ‹€.

μ΄λŠ” λ ˆμ½”λ“œκ°€ λ°˜λ³΅λ˜μ–΄ μ½μ–΄μ§€λŠ” μƒν™©μ—μ„œ λ°œμƒν•˜λŠ” λΆ€μ •ν•© λ¬Έμ œμ΄λ‹€.

그림처럼 μ‚¬μš©μž Bκ°€ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜κ³  β€˜Toto’인 μ‚¬μš©μžλ₯Ό κ²€μƒ‰ν–ˆλŠ”λ° κ²°κ³ΌλŠ” μ—†μ—ˆλ‹€. ν•˜μ§€λ§Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜(μ‚¬μš©μž A)μ—μ„œ 데이터λ₯Ό λ³€κ²½ν•˜κ³  컀밋 ν›„, λ˜‘κ°™μ€ νŠΈλžœμž­μ…˜(μ‚¬μš©μž B)μ—μ„œ μ‘°νšŒν•œ κ²°κ³Ό 1건이 μ‘°νšŒλœλ‹€.

μ΄λŠ” ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ select queryλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ, 항상 같은 κ²°κ³Όλ₯Ό 가져와야 ν•œλ‹€λŠ” β€œRepeateble read” 정합성에 μ–΄κΈ‹λ‚˜λŠ” 것이닀.

  • μ΄λŸ¬ν•œ ν˜„μƒμ„ β€œNon-Repeatable Read” 라고 ν•œλ‹€.

  • 금육 μ„œλΉ„μŠ€μ—μ„œ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ—μ„œ μž…/좜금 μ²˜λ¦¬κ°€ 진행될 λ•Œ, λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ 쑰회λ₯Ό μ§„ν–‰ν•  λ•Œ select query μ‹€ν–‰λ§ˆλ‹€ λ‹€λ₯Έ κ²°κ³Όλ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€.

μ€‘μš”ν•œ 것은 μ‚¬μš© 쀑인 격리 μˆ˜μ€€μ—μ„œ μ‹€ν–‰λ˜λŠ” 쿼리가 μ–΄λ–€ κ²°κ³Όλ₯Ό κ°€μ Έμ˜€κ²Œ λ˜λŠ”μ§€ μ˜ˆμΈ‘ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.

Repeatable Read

Repeatable ReadλŠ” MySQL InnoDB Storage Engineμ—μ„œ 기본으둜 μ‚¬μš©λ˜λŠ” 격리 μˆ˜μ€€μ΄λ‹€.

Binary logλ₯Ό κ°€μ§„ MySQL μ„œλ²„μ—μ„œλŠ” μ΅œμ†Œ Repeatable Read 격리 μˆ˜μ€€ 이상을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  • 이 격리 μˆ˜μ€€μ—μ„œλŠ” β€œNon-Repeatable Read” 뢀정합이 λ°œμƒλ˜μ§€ μ•ŠλŠ”λ‹€.

InnoDBλŠ” νŠΈλžœμž­μ…˜μ΄ Rollback 될 κ°€λŠ₯성에 λŒ€λΉ„ν•΄ λ³€κ²½λ˜κΈ° μ „ 언두(Undo) 곡간에 λ°±μ—…ν•˜κ³  μ‹€μ œ λ ˆμ½”λ“œ 값을 λ³€κ²½ν•œλ‹€. μ΄λŸ¬ν•œ λ³€κ²½ 방식을 MVCC라고 ν•˜λ©°, Repeatable Read 격리 μˆ˜μ€€μ€ MVCCλ₯Ό μœ„ν•΄ 언두 μ˜μ—­μ— λ°±μ—…λœ 이전 데이터λ₯Ό μ΄μš©ν•΄ 동일 νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œλŠ” λ™μΌν•œ κ²°κ³Όλ₯Ό 보여쀄 수 있게 보μž₯ν•œλ‹€.

Read Committed도 MVCCλ₯Ό μ΄μš©ν•΄ commit 되기 μ „μ˜ 데이터λ₯Ό λ³΄μ—¬μ£Όμ§€λ§Œ, Repeatable Read와 μ°¨μ΄λŠ” 언두 μ˜μ—­μ— λ°±μ—…λœ λ ˆμ½”λ“œμ˜ μ—¬λŸ¬ 버전 쀑 λͺ‡ 번째 이전 λ²„μ „κΉŒμ§€ μ°Ύμ•„κ°€λŠλƒμ— μžˆλ‹€.

πŸ”₯νŠΈλžœμž­μ…˜ λ‚΄λΆ€μ—μ„œ μ‹€ν–‰λ˜λŠ” select와 μ™ΈλΆ€μ—μ„œ μ‹€ν–‰λ˜λŠ” select의 차이가 μ—†λŠ” Read Committed와 λ‹€λ₯΄κ²Œ Repeatable Read μ—μ„œμ˜ select queryλŠ” νŠΈλžœμž­μ…˜ λ²”μœ„ λ‚΄μ—μ„œλ§Œ μ‘΄μž¬ν•œλ‹€.

Read Committed:

  • νŠΈλžœμž­μ…˜ λ‚΄/μ™ΈλΆ€μ—μ„œ μ‹€ν–‰λ˜λŠ” select query κ²°κ³Όκ°€ 크게 λ‹€λ₯΄μ§€ μ•Šλ‹€.

  • 각 select queryλŠ” ν•΄λ‹Ή μ‹œμ μ— 컀밋 된 λ°μ΄ν„°λ§Œ μ½λŠ”λ‹€.

  • λ™μΌν•œ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œλ„ μ—¬λŸ¬ 번의 select queryλŠ” μ„œλ‘œ λ‹€λ₯Έ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€.

    • B νŠΈλžœμž­μ…˜μ—μ„œ 두 번의 select queryλ₯Ό μ‹€ν–‰ν•  λ•Œ A의 νŠΈλžœμž­μ…˜μ˜ 컀밋 μ „/ν›„

Repeatable Read:

  • select queryλŠ” νŠΈλžœμž­μ…˜μ΄ μ‹œμž‘λœ μ‹œμ μ˜ 데이터 μŠ€λƒ…μƒ·μ„ κΈ°μ€€μœΌλ‘œ μ‹€ν–‰λœλ‹€.

  • νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ—¬λŸ¬ 번의 select queryκ°€ μ‹€ν–‰λ˜μ–΄λ„ 항상 같은 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

  • λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ 데이터λ₯Ό λ³€κ²½ν•˜κ³  컀밋 해도, ν˜„μž¬ νŠΈλžœμž­μ…˜ λ‚΄μ˜ select query κ²°κ³ΌλŠ” λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

λͺ¨λ“  InnoDB의 νŠΈλžœμž­μ…˜μ€ κ³ μœ ν•œ transaction_id(순차적으둜 μ¦κ°€ν•˜λŠ” κ°’)을 κ°€μ§€λ©°, 언두 μ˜μ—­μ— λ°±μ—…λœ λͺ¨λ“  λ ˆμ½”λ“œμ—λŠ” 변경을 λ°œμƒμ‹œν‚¨ transaction_idκ°€ ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

언두 μ˜μ—­μ˜ λ°±μ—…λœ λ°μ΄ν„°λŠ” InnoDB 엔진이 λΆˆν•„μš”ν•˜λ‹€κ³  νŒλ‹¨ν•˜λŠ” μ‹œμ μ— 주기적으둜 μ‚­μ œν•œλ‹€. MVCCλ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ μ‹€ν–‰ 쀑인 νŠΈλžœμž­μ…˜ κ°€μš΄λ° κ°€μž₯ 였래된 νŠΈλžœμž­μ…˜ λ²ˆν˜Έλ³΄λ‹€ νŠΈλžœμž­μ…˜ λ²ˆν˜Έκ°€ μ•žμ„  언두 μ˜μ—­μ˜ λ°μ΄ν„°λŠ” μ‚­μ œν•  수 μ—†λ‹€. (ν•„μš”λ‘œ μƒκ°λ˜λŠ” 더 μž‘μ€ trx_idλ₯Ό μ‚­μ œν•  수 μ—†λ‹€.)

κ·Έλ¦Όμ—μ„œ ν…Œμ΄λΈ”μ— μ €μž₯된 λ ˆμ½”λ“œμ˜ trx_idλŠ” 6이닀.

μ‚¬μš©μž B의 νŠΈλžœμž­μ…˜(id=10)이 λ¨Όμ € μ‹œμž‘λ˜κ³ , 쀑간에 μ‚¬μš©μž A의 νŠΈλžœμž­μ…˜(id=12)이 데이터λ₯Ό 변경해도 μ‚¬μš©μž B의 νŠΈλžœμž­μ…˜μ˜ select query κ²°κ³ΌλŠ” 항상 λ™μΌν•˜λ‹€.

  • μ‚¬μš©μž B νŠΈλžœμž­μ…˜μ€ μžμ‹ λ³΄λ‹€ μž‘μ€ νŠΈλžœμž­μ…˜ 번호(10보닀 μž‘μ€)의 λ³€κ²½μ‚¬ν•­λ§Œμ„ 바라본닀.

  • MVCC의 핡심 원칙 쀑, μ‹€ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ 이전 λ²„μ „μ˜ 데이터λ₯Ό 읽어야 ν•  수 μžˆμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή νŠΈλžœμž­μ…˜λ³΄λ‹€ 였래된(λ²ˆν˜Έκ°€ μž‘μ€) λ°μ΄ν„°λŠ” λ³΄μ‘΄λ˜μ–΄μ•Ό ν•œλ‹€.

Repeatable Read 격리 μˆ˜μ€€μ—μ„œλ„ Phantom Read 뢀정합이 λ°œμƒν•  수 μžˆλ‹€.

그림처럼 μ‚¬μš©μž B의 νŠΈλžœμž­μ…˜μ΄ λ¨Όμ € μ‹€ν–‰ν•˜κ³  μ‘°νšŒν•œλ‹€. 그리고 μ‚¬μš©μž A의 νŠΈλžœμž­μ…˜μ—μ„œ λ ˆμ½”λ“œλ₯Ό μ‚½μž…ν•˜κ³  commit ν•œλ‹€. 그런데 λ§ˆμ§€λ§‰μ— μ‚¬μš©μž B νŠΈλžœμž­μ…˜μ—μ„œ 전체 λ ˆμ½”λ“œλ₯Ό μ‘°νšŒν•˜λ©΄ λ ˆμ½”λ“œμ˜ 총 λ ˆμ½”λ“œ κ°―μˆ˜κ°€ λ‹€λ₯΄λ‹€.

Repeatable Read 격리 μˆ˜μ€€μ΄λΌλ©΄ select qeury의 κ²°κ³Όκ°€ λ˜‘κ°™μ•„μ•Ό ν•˜λŠ”λ°, λ‹€λ₯΄κ²Œ λ‚˜μ˜¨ 것이닀.

μ΄λ ‡κ²Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μˆ˜ν–‰ν•œ λ³€κ²½ μž‘μ—…μ— μ˜ν•΄ λ ˆμ½”λ“œκ°€ λ³΄μ˜€λ‹€, μ•ˆ λ³΄μ˜€λ‹€ ν•˜λŠ” ν˜„μƒμ„ β€œPhantom Read" 라고 ν•œλ‹€.

select … for update queryλŠ” λ ˆμ½”λ“œμ— μ“°κΈ° μž κΈˆμ„ κ±Έμ–΄μ•Ό ν•˜λŠ”λ°, 언두 λ ˆμ½”λ“œμ—λŠ” μž κΈˆμ„ κ±Έ 수 μ—†λ‹€.

κ·Έλž˜μ„œ select … for updateλ‚˜ select … lock in share mode둜 μ‘°νšŒλ˜λŠ” λ ˆμ½”λ“œλŠ” 언두 μ˜μ—­μ˜ λ³€κ²½ μ „ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 것이 μ•„λ‹ˆλΌ ν˜„μž¬ λ ˆμ½”λ“œμ˜ 값을 κ°€μ Έμ˜€κ²Œ λœλ‹€.

πŸ€” μ•žμ—μ„œ ν•™μŠ΅ν•œ MySQL 잠금(Next-Key Lock)에 μ˜ν•˜λ©΄ μœ„ 그림은 잘λͺ»λœ 것이 μ•„λ‹Œκ°€?

λ§žλ‹€. μ‚¬μš©μž B νŠΈλžœμž­μ…˜μ—μ„œ select .. where emp_no β‰₯500000 for update queryκ°€ μˆ˜ν–‰λ˜λ©΄, emp_no=500000인 λ ˆμ½”λ“œμ™€ κ·Έ μ΄ν›„μ˜ Gap(500000-INF)에 λŒ€ν•΄μ„œ 락을 건닀. μ‚¬μš©μž A νŠΈλžœμž­μ…˜μ—μ„œ μ‚½μž…ν•˜λ €λŠ” λ ˆμ½”λ“œμ˜ emp_no=500001은 500000 μ΄ν›„μ˜ 갭에 μžˆμœΌλ―€λ‘œ, insertκ°€ λ§‰ν˜€μ•Ό ν•œλ‹€.

κ·Έλž˜μ„œ 격리 μˆ˜μ€€μ˜ ν‘œλ₯Ό 보면, Repeatable Read의 νŒ¬ν…€ λ¦¬λ“œλŠ” InnoDBμ—μ„œ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. (Next-Key Lock)

Repeatable Readμ—μ„œλŠ” νŠΈλžœμž­μ…˜ μ‹œμž‘ μ‹œμ μ˜ 데이터 μŠ€λƒ…μƒ·μ„ κΈ°μ€€μœΌλ‘œ μΌκ΄€λœ 읽기λ₯Ό 보μž₯ν•˜μ§€λ§Œ, 이것이 언두 둜그λ₯Ό 계속 μœ μ§€ν•œλ‹€λŠ” μ˜λ―ΈλŠ” μ•„λ‹ˆλ‹€.

Serializable

κ°€μž₯ μ—„κ²©ν•œ 격리 μˆ˜μ€€μœΌλ‘œ λ™μ‹œ 처리 μ„±λŠ₯도 λ‹€λ₯Έ 격리 μˆ˜μ€€λ³΄λ‹€ λ–¨μ–΄μ§„λ‹€.

이 격리 μˆ˜μ€€μœΌλ‘œ μ„€μ •λ˜λ©΄ 읽기 μž‘μ—…λ„ 곡유 잠금(읽기 잠금)을 νšλ“ν•΄μ•Ό ν•˜λ©°, λ™μ‹œμ— λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œλŠ” ν•΄λ‹Ήλ˜λŠ” λ ˆμ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ λͺ»ν•œλ‹€.

  • ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ—μ„œ 읽고 μ“°λŠ” λ ˆμ½”λ“œμ— λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œλŠ” μ ˆλŒ€ μ ‘κ·Όν•  수 μ—†λ‹€.

Serializable 격리 μˆ˜μ€€μ—μ„œλŠ” 일반 DBMSμ—μ„œ λ°œμƒν•˜λŠ” νŒ¬ν…€ λ¦¬λ“œ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ InnoDB μŠ€ν† λ¦¬μ§€ 엔진을 μ‚¬μš©ν•œλ‹€λ©΄ κ°­ 락과 λ„₯슀트 ν‚€ 락 덕뢄에 Repeatable Readμ—μ„œλ„ νŒ¬ν…€ λ¦¬λ“œκ°€ λ°œμƒν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ꡳ이 Serializableλ₯Ό μ‚¬μš©ν•  ν•„μš”μ„±μ€ μ—†λ‹€.

Last updated