Π”Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ (2PC β€” Two-Phase Commit) β€” это Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт согласованноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ распрСдСлСнных Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° транзакция Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ нСсколько рСсурсов ΠΈΠ»ΠΈ систСм, находящихся Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΡƒΠ·Π»Π°Ρ… ΠΈΠ»ΠΈ сСрвСрах.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ являСтся стандартом Π² систСмах, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡƒΠ·Π»Π°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, распрСдСлСнныС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, микросСрвисы, Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π΄Π°Π½Π½Ρ‹Ρ…).


πŸ“Œ Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ΅Π½ Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚?

Когда транзакция Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ нСсколько Ρ€Π°Π·Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² ΠΈΠ»ΠΈ систСм, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:

  • Как ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π»ΠΈΠ±ΠΎ всС участники Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (commit), Π»ΠΈΠ±ΠΎ всС вмСстС ΠΎΡ‚ΠΊΠ°Π·Π°Π»ΠΈΡΡŒ ΠΎΡ‚ Π½ΠΈΡ… (rollback)?
  • НуТно Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ситуации, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½Π° Ρ‡Π°ΡΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π°, Π° другая β€” Π½Π΅Ρ‚.

ИмСнно для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ примСняСтся Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚.


πŸ“ Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ (2PC)?

Алгоритм состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°Π·:

βœ… Π€Π°Π·Π° 1: ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° (Prepare Phase)

ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ (Transaction Coordinator) отправляСт всСм участникам Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ (Transaction Participants) запрос Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ ΠΊ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ:

  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ участник провСряСт, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΎΠ½ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ (провСряСт рСсурсы, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Ρ‚.Π΄.).
  • Если участник Π³ΠΎΡ‚ΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€Ρƒ Β«Π³ΠΎΡ‚ΠΎΠ²Β» (VOTE_COMMIT).
  • Если хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ участник Π½Π΅ Π³ΠΎΡ‚ΠΎΠ², ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€Ρƒ Β«Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²Β» (VOTE_ABORT).

На этом этапС Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΅Ρ‰Π΅ Π½Π΅ фиксируСтся ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ участник Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π³ΠΎΡ‚ΠΎΠ² ΠΊ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ.

βœ… Π€Π°Π·Π° 2: ΠšΠΎΠΌΠΌΠΈΡ‚ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚ (Commit/Rollback Phase)

ПослС сбора ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€ Ρ€Π΅ΡˆΠ°Π΅Ρ‚:

  • Если Π’Π‘Π• участники Π³ΠΎΡ‚ΠΎΠ²Ρ‹: ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€ отправляСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ COMMIT всСм участникам.
    • Участники Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ измСнСния.
  • Если хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ участник Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²: ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€ отправляСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ROLLBACK всСм участникам.
    • ВсС участники ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ измСнСния, транзакция считаСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ.

🎯 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°:

ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€             Участник A            Участник B
    |                         |                      |
    |----- Prepare ---------->|                      |
    |                         |-- Prepare ---------->|
    |                         |                      |
    |<----- VOTE_COMMIT ------|                      |
    |                         |<---- VOTE_COMMIT ----|
    |                         |                      |
 (ΠΎΠ±Π° согласны, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ)   |                      |
    |----- Commit ----------->|                      |
    |                         |----- Commit -------->|
    |                         |                      |
    |<----- ACK (Π³ΠΎΡ‚ΠΎΠ²ΠΎ) -----|                      |
    |                         |<---- ACK (Π³ΠΎΡ‚ΠΎΠ²ΠΎ) ---|
(Вранзакция ΡƒΡΠΏΠ΅ΡˆΠ½Π°!)

Если хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ участник ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ VOTE_ABORT, транзакция прСрываСтся:

ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€             Участник A            Участник B
    |                         |                      |
    |----- Prepare ---------->|                      |
    |                         |-- Prepare ---------->|
    |                         |                      |
    |<----- VOTE_ABORT -------|                      |
(Участник A Π½Π΅ Π³ΠΎΡ‚ΠΎΠ², ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ измСнСния!)
    |----- Rollback --------->|                      |
    |                         |----- Rollback ------>|
    |                         |                      |
    |<----- ACK (Π³ΠΎΡ‚ΠΎΠ²ΠΎ) -----|                      |
    |                         |<---- ACK (Π³ΠΎΡ‚ΠΎΠ²ΠΎ) ---|
(Вранзакция ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½Π°!)


πŸ“Œ ΠŸΠ»ΡŽΡΡ‹ ΠΈ минусы Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°

βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° (ΠΏΠ»ΡŽΡΡ‹):

  • Гарантия согласованности (Consistency) Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡƒΠ·Π»Π°Ρ….
  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ понимания.

⚠️ НСдостатки (минусы):

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ситуации Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ (участники ΠΆΠ΄ΡƒΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ commit/rollback).
  • ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² случаС ΠΎΡ‚ΠΊΠ°Π·Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€Π° (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π»ΠΎΠ³ΠΈΠΊΠ° восстановлСния).
  • Π‘Π½ΠΈΠΆΠ°Π΅Ρ‚ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ всСх участников).

🚩 Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚?

  • Π’ распрСдСлСнных рСляционных Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ….
  • Π’ микросСрвисах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‚ нСсколько нСзависимых Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ….
  • Π’ распрСдСлСнных Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ систСм ΠΈ сцСнариСв, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 2PC:

  • **Apache Kafka
  • **РаспрСдСлённыС Π‘Π£Π‘Π”
  • БистСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² банковской ΠΈ финансовой сфСрС.

πŸ“Š ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΈΡ‚ΠΎΠ³ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°:

Π€Π°Π·Π°Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
Π€Π°Π·Π° 1ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° готовности всСх участниковЛибо всС Β«Π³ΠΎΡ‚ΠΎΠ²Ρ‹Β», Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΊΠ°Π·
Π€Π°Π·Π° 2Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚ всСх участниковВсС коммитятся ΠΈΠ»ΠΈ всС ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°ΡŽΡ‚

πŸš€ Π’Ρ‹Π²ΠΎΠ΄ (ΠΊΡ€Π°Ρ‚ΠΊΠΎ):

Π”Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ β€” Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ ΠΈ простой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ согласованных Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими участниками. Однако Π΅Π³ΠΎ использованиС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ внимания ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ отказоустойчивости, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌ ΠΈ ΡƒΠ·ΠΊΠΈΠΌ мСстам.