Bu men ikki xil dvigatelda ikki marta ko'rgan xato. Bitta eksport 10:00 da ishlaydi va ko'rgan eng yuqori oxirgi o'zgarish vaqt tamg'asini qayd etadi. 09:58 da boshlangan bitta tranzaksiya hali ochiq, 10:03 da commit bo'ladi va o'z boshlangan onidagi vaqt tamg'asini olib yuradi. Keyingi eksport faqat 10:00 dan yangi satrlarni so'raydi va uni hech qachon ko'rmaydi. Uzatish hajmi a'lo edi, ma'lumot esa noto'g'ri.

Bitta satrni yo'qotgan eksportni kuzatib chiqing

SQL emas, voqealar tartibini kuzating. Dastur satrning o'zgarish vaqtini tranzaksiya boshlanganda yozadi, commit bo'lganda emas. Eksportchi tranzaksiya hali ochiq turganda devor soati suv belgisini o'qiydi. So'ng tranzaksiya saqlangan suv belgisidan eskiroq o'zgarish vaqti bilan commit bo'ladi. Iste'molchining keyingi partiyasi suv belgisidan keyin boshlanadi, shuning uchun satr kursor orqasida qoladi va boshqa hech qachon tanlanmaydi.

Hech narsa xatoni qayd etmaydi, chunki hech narsa muvaffaqiyatsiz bo'lmadi. Shu sababli bu toifadagi xatolar qimmat: delta oqimi tez, satrlar soni ishonchli ko'rinadi va yo'qolgan satr haftalar o'tib hech kim qayta hosil qila olmaydigan moslashtirish bileti sifatida chiqadi.

Tartib raqamlarida boshqa sabab bilan xuddi shu shakldagi nuqson bor. Monoton ID qiymatlarning qanday taqsimlanganini aytadi, tranzaksiyalarning qanday commit bo'lganini emas. Past raqam olgan tranzaksiya yuqori raqam olganidan keyin commit bo'lishi mumkin, shuning uchun taqsimlash tartibiga asoslangan kursor ham teshik qoldirishi mumkin.

Oqim berishi kerak bo'lgan besh va'da

Transportni tanlashdan oldin manba tizimdan besh bandli shartnoma so'rang. Agar biror band yetishmasa, sizda o'zgarishlar oqimi emas, evristika bor.

  • Qamrov: kiritishlar, yangilanishlar va o'chirishlar, har biri qo'llash uchun zarur barqaror kalit bilan.
  • Chegara: kursor qiymati nimani anglatadi va izchil partiya nimalarni o'z ichiga oladi.
  • Izchillik: bog'liq jadvallar mos kelmaydigan manba holatlarini aralashtirmasdan qanday o'qiladi.
  • Saqlash: uzilgan iste'molchi o'z saqlangan joyidan qancha vaqt davom eta oladi.
  • Qayta ishga tushirish: o'sha joy endi haqiqiy bo'lmaganda qo'llab-quvvatlanadigan to'liq snapshot.

Qo'llab-quvvatlanadigan mexanizm beshtasini ham qondirishi mumkin. SQL Server'ning o'zgarishlarni kuzatish hujjati bitta aniq nashr etilgan misol: u minimal haqiqiy versiyani belgilaydi, o'zgarishlar bilan birga o'chirishlarni ham qayd etadi va tekshirish, versiyani qamrab olish va tegishli o'zgarish so'rovlarini qamrab oluvchi snapshot tranzaksiyasini tavsiflaydi. Bu manbadan nima talab qilish kerakligiga misol, boshqa dvigatelga yopishtiriladigan sintaksis emas.

Tekshirish nuqtasini quvur liniyasining qismi sifatida loyihalang

Iste'molchining saqlangan joyi haqiqiy holat mashinasi, shuning uchun uni shunday yozing. Kursor faqat partiyani allaqachon qo'llagan va maqsad tranzaksiyani commit qilgan ish oqimi orqali oldinga siljishi mumkin.

cursor  = durable_checkpoint()          # last fully applied position
batch   = extract(cursor, upper_bound)  # one consistent batch
apply(batch)                            # idempotent at the target
commit()
checkpoint(batch.upper_bound)           # only now

Agar yetkazib berish yarim yo'lda muvaffaqiyatsiz bo'lsa, yangi manba joyini o'ylab topish o'rniga o'sha partiyani moslashtiring. Yangiroq yuqori chegara bilan qayta chiqarish qisman qo'llashning doimiy bo'shliqqa aylanish yo'lidir. Ko'zgu qoidasi ikkinchi tomonda ham amal qiladi: maqsadda idempotent qo'llash takrorlarni oldini oladi va chiqarish hech qachon ko'rmagan o'zgarish uchun hech narsa qilmaydi.

O'chirishlar yozuvlarni talab qiladi, xulosalarni emas

Hali mavjud satrlarni taqqoslash iste'molchiga qaysi kalitlar yo'qolganini ayta olmaydi. O'chirishlarni hech qachon qayd etmaydigan manba sizga ikkita to'liq bo'lmagan variant qoldiradi: farq uchun yetarlicha uzoq kalit tarixini saqlash yoki jadval bo'yicha aniq to'liq moslashtirishni ishga tushirish. Ikkalasi ham xarajatli loyihalash qarorlari va hech biri egasi bo'lmasa mavjud emas.

Saqlash ham xuddi shunday qaror. Har bir qo'llab-quvvatlanadigan o'zgarishlar oqimining oynasi bor; uni shartnomada ko'rsating va iste'molchining tekshirish nuqtasi unga yaqinlashganda ogohlantiring. Ikki haftalik uzilishdan keyin uyg'onadigan iste'molchi jimgina qisman partiya olish o'rniga aniq "qayta ishga tushirish kerak" xatosini o'qishi kerak.

So'ng delta arziydimi-yo'qmi o'lchang

Har bir kalit va xeshni taqqoslashga qaytish ba'zan to'g'ri va uning xarajatini bilishga arziydi. Siz hali ham har bir satr haqidagi ma'lumotni uzatasiz, xeshlar jadvallar oralig'ida izchil snapshot bermaydi va xesh sxemasi vakillik va to'qnashuvlar haqida o'z savollarini olib keladi. Tekshirsa bo'ladigan chegara bilan kamroq bayt — maqsad; commit qilingan o'zgarishni jimgina tashlab yuboradigan kamroq bayt esa umuman delta emas.

Oxirgi o'zgarish ustuni — ishora. Kech commit, o'chirish va uzoq uzilishdan omon qolgan kursor — shartnoma.

O'xshash maqolalar