Three-Phase Commit — distributed transaction ishtirokchilari orasida commit yoki abort qarorini muvofiqlashtirishga mo‘ljallangan protocol. Qisqartmasi 3PC. U Two-Phase Commitdagi ayrim blocking holatlarini kamaytirish uchun commit jarayoniga qo‘shimcha oraliq bosqich kiritadi.
Protocol nazariy jihatdan cheklangan network va timing taxminlariga tayanadi. Real distributed tizimlarda network partition va failure sabab qo‘llanishi cheklangan.
Ishtirokchilar
Protocol odatda quyidagi rollarga ega:
- Coordinator — transaction qarorini boshqaradi;
- Participant — local resource yoki database amallarini bajaradi.
Coordinator barcha participantlardan javob yig‘adi.
Participantlar local transaction holatini saqlaydi.
Uch bosqich
Three-Phase Commitning asosiy bosqichlari:
- CanCommit;
- PreCommit;
- DoCommit.
Nomlar implementation va manbalarda biroz farq qilishi mumkin.
CanCommit
Coordinator participantlardan transactionni commit qilishga tayyormi deb so‘raydi.
Har participant:
- local validation;
- resource mavjudligi;
- constraint;
- transactionni boshlash imkoniyati
ni tekshiradi.
Javob Yes yoki No.
Bitta No bo‘lsa coordinator abort qarorini beradi.
PreCommit
Barcha participantlar Yes desa coordinator PreCommit yuboradi.
Participant:
- commitga tayyor holatni durable saqlaydi;
- kerakli locklarni ushlab turadi;
- acknowledgement yuboradi.
Bu bosqich participantlarga umumiy qaror commit tomon ketayotganini bildiradi.
DoCommit
Barcha PreCommit acknowledgementlari kelgach coordinator DoCommit yuboradi.
Participant local transactionni commit qiladi va yakuniy acknowledgement qaytaradi.
Coordinator transaction tugaganini qayd etadi.
Abort
CanCommit bosqichida rad javobi yoki timeout bo‘lsa abort yuboriladi.
Participant local transactionni rollback qiladi va locklarni bo‘shatadi.
PreCommitdan keyingi abort semantikasi protocol taxminlari va failure holatiga bog‘liq.
Two-Phase Commit bilan farqi
2PC bosqichlari:
Prepare
→ Commit
Coordinator prepare’dan keyin yo‘qolsa participantlar qarorni bilmay locklarni ushlab qolishi mumkin.
3PC PreCommit orqali participantga commit qaroriga yaqin oraliq holat beradi.
Ayrim timeout holatlarida participant mustaqil qaror chiqarishga urinishi mumkin.
Non-blocking maqsadi
3PC ma’lum taxminlar ostida participantlarning cheksiz bloklanishini kamaytiradi.
Taxminlar:
- bounded message delay;
- failure detection;
- network partition yo‘qligi yoki cheklanganligi;
- bir xil vaqt modeli.
Asynchronous real networkda bu taxminlar har doim bajarilmaydi.
Timeout
Har bosqich uchun timeout mavjud.
CanCommit vaqtida timeout participantning abort qilishiga olib kelishi mumkin.
PreCommit holatida participant boshqa participantlar holatini aniqlash yoki commit tomon yurish qoidalariga ega bo‘lishi mumkin.
Timeoutning o‘zi node o‘chganini isbotlamaydi.
Coordinator failure
Coordinator ishlamay qolsa participantlar yangi coordinator tanlashi mumkin.
Yangi coordinator participantlarning state’ini yig‘adi:
- abort holati bormi;
- precommit holati bormi;
- commit qilinganmi.
Keyin xavfsiz qaror chiqarishga urinadi.
Network partition bu jarayonni murakkablashtiradi.
Participant failure
Participant qayta ishga tushganda durable logdan o‘z holatini tiklaydi.
U coordinator yoki boshqa participantdan yakuniy qarorni so‘raydi.
Local log bo‘lmasa transaction holati yo‘qolishi mumkin.
Network partition
Partition cluster’ni ikki guruhga ajratishi mumkin.
Har guruh boshqa failure xulosasiga kelishi ehtimoli bor.
3PC classic modelda network partitionga to‘liq xavfsiz yechim bermaydi.
Shu sababli consensus protocol va replicated state machine ko‘proq ishlatiladi.
Atomicity
Maqsad barcha participantlar commit qilishi yoki barchasi abort qilishi.
Ammo failure model va protocol taxminlari buzilsa atomicity yoki availability xavf ostida qoladi.
Distributed commit har doim coordination, latency va blocking xarajatiga ega.
Locklar
Participant transaction davomida row yoki resource locklarini ushlab turishi mumkin.
Uchta network round-trip lock vaqtini uzaytiradi.
Contention yuqori workload’da throughput kamayadi.
Durability
Har state transition local durable logga yozilishi kerak.
Masalan:
VOTED_YES
PRECOMMITTED
COMMITTED
ABORTED
Crashdan keyin participant log orqali recovery qiladi.
3PC va Consensus
Consensus node’lar yagona log yoki qaror ustida kelishishini boshqaradi.
3PC esa ma’lum transactionni bir nechta resource’da commit qilishga qaratilgan.
Consensus coordinator state’ini replicated qilish uchun ishlatilishi mumkin, ammo participant resource transactionlari muammosi qoladi.
Amaliy qo‘llanish
3PC nazariy va ta’limiy jihatdan muhim.
Amaliy tizimlarda ko‘pincha:
- 2PC;
- consensusga asoslangan database;
- Saga;
- TCC;
- Transactional Outbox;
- idempotent workflow
tanlanadi.
Tanlov consistency va availability talabiga bog‘liq.
Kamchiliklari
3PC:
- ko‘proq message round-trip;
- yuqori latency;
- murakkab recovery;
- timing taxminlari;
- partition muammosi;
- uzoq lock
xarajatiga ega.
“Uchinchi bosqich” barcha distributed failure’ni avtomatik hal qilmaydi.
Heuristic qaror
Participant yakuniy qarorni bilmay uzoq qolsa operator yoki local policy asosida heuristic commit yoki abort qilishi mumkin.
Bu atomicity buzilishi xavfini tug‘diradi.
Heuristic natija audit va reconciliation talab qiladi.
Recovery coordinator
Yangi coordinator faqat participantlardan javob olgan holda xavfsiz qaror chiqaradi.
Javob bermayotgan participant holati noma’lum bo‘lsa protocol yana bloklanishi mumkin.
Bu perfect failure detector yo‘qligining amaliy oqibati.
Throughput
Har transaction uchun uch coordination bosqichi va durable log write’lari kerak.
Geografik uzoq participantlarda latency keskin oshadi.
Shu sababli qisqa, yuqori throughputli operationlar uchun 3PC odatda mos emas.
Participant membership
Transaction boshlangandan keyin qaysi participantlar qatnashishi o‘zgarmas ro‘yxat sifatida saqlanadi.
Yangi participantni PreCommitdan keyin qo‘shish mumkin emas.
Coordinator recovery vaqtida aynan shu membership bilan qaror qiladi.
Bog‘liq tushunchalar
Distributed transaction, Two-Phase Commit, Coordinator, Participant, PreCommit, Atomicity, Consensus, Network partition, Transaction log, Saga pattern