Таны дельта урсгал хожуу коммитуудыг алгасдаг: найдвартай курсор бүтээ
Нэг мөр хоцорч ирсэн нь усан тэмдэг коммитын хил биш байсантай холбоотой. Алдааг дагаж үзээд, дараа нь хамрах хүрээ, хил, хадгалалт, аюулгүй үргэлжлэлийг тодорхойл.
Энэ бол хоёр өөр хөдөлгүүрт хоёр удаа харсан алдаа юм. Экспорт 10:00 цагт ажиллаж, харсан хамгийн өндөр сүүлчийн өөрчлөлтийн цагийн тэмдгийг бүртгэдэг. 09:58 цагт эхэлсэн нэг транзакц одоо ч нээлттэй, 10:03 цагт коммит болж, эхэлсэн үеийн цагийн тэмдгийг агуулна. Дараагийн экспорт зөвхөн 10:00-аас шинэ мөрүүдийг хүсдэг бөгөөд түүнийг хэзээ ч хардаггүй. Дамжуулалтын хэмжээ маш сайн байсан бол өгөгдөл буруу байсан.
Нэг мөр алдсан экспортыг дага
SQL биш, үйл явдлын дарааллыг дага. Аппликешн мөрийн өөрчлөлтийн цагийг транзакц эхлэхэд бичдэг, коммит болох үед биш. Экспортлогч транзакц нээлттэй байх үед хананы цагийн усан тэмдгийг уншдаг. Дараа нь транзакц хадгалсан усан тэмдгээс хуучин өөрчлөлтийн цагтай коммит болдог. Хэрэглэгчийн дараагийн багц усан тэмдгийн дараа эхэлдэг тул мөр курсорын ард үлдэж, хэзээ ч дахин сонгогдохгүй.
Юу ч алдаа бүртгэдэггүй, учир нь юу ч бүтэлгүйтээгүй. Энэ л энэ төрлийн алдааг үнэтэй болгодог: дельта урсгал хурдан, мөрийн тоо үнэмшилтэй харагдана, алга болсон мөр долоо хоногийн дараа хэн ч давтаж чадахгүй тохиролцооны тасалбар болж гарч ирдэг.
Дарааллын дугааруудад өөр шалтгаанаар ижил хэлбэрийн алдаа бий. Монотон ID утгуудыг хуваарилсан дарааллыг хэлдэг, транзакцууд коммит болсон дарааллыг биш. Бага дугаар авсан транзакц өндөр дугаар авсны дараа коммит болж болох тул хуваарилалтын дараалалд суурилсан курсор ч нүх үлдээж болно.
Урсгал өгөх ёстой таван амлалт
Тээврийг сонгохын өмнө эх системээс таван заалттай гэрээ шаард. Аль нэг заалт дутуу бол танд өөрчлөлтийн урсгал биш, эвристик байна.
- Хамрах хүрээ: оруулалт, шинэчлэлт, устгалууд, тус бүр хэрэглэхэд шаардлагатай тогтвортой түлхүүртэйгээр.
- Хил: курсорын утга ямар утгатай, тууштай багц юу агуулдаг.
- Тууштай байдал: үл нийцэх эх төлөвүүдийг холихгүйгээр холбоотой хүснэгтүүдийг хэрхэн уншдаг.
- Хадгалалт: салсан хэрэглэгч хадгалсан байрлалаасаа хэр удаан үргэлжлүүлж болох.
- Дахин эхлүүлэлт: тэр байрлал хүчингүй болсон үед дэмжигдсэн бүрэн snapshot.
Дэмжигдсэн механизм тавыг бүгдийг хангаж чадна. SQL Server-ийн өөрчлөлт хяналтын баримт бичиг нь тодорхой нийтлэгдсэн жишээ: хамгийн бага хүчинтэй хувилбарыг тодорхойлж, өөрчлөлтүүдийн хамт устгалуудыг бүртгэж, баталгаажуулалт, хувилбар барих, холбогдох өөрчлөлтийн асуулгыг хамарсан snapshot транзакцыг тайлбарладаг. Энэ нь эх сурвалжаас юу шаардах ёстойн жишээ, өөр хөдөлгүүрт нааж болох синтакс биш.
Хяналтын цэгийг дамжуулах хоолойн хэсэг болгон зохион бүтээ
Хэрэглэгчийн хадгалсан байрлал бол жинхэнэ төлөвийн машин, тиймээс түүнийг тэгж бич. Курсор зөвхөн багцыг аль хэдийн хэрэглэж, зорилтот транзакцыг коммит болгосон ажлын урсгалаар урагшилж болно.
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
Хүргэлт хагас замд бүтэлгүйтвэл шинэ эх байрлал зохиохын оронд мөнөөх багцыг тохируул. Илүү шинэ дээд хилээр дахин гаргаж авах нь хэсэгчилсэн хэрэглэлийг байнгын цоорхой болгох зам юм. Толин дүрэм нөгөө талд ч мөрдөгдөнө: зорилтод идемпотент хэрэглэх нь давхардлыг сэргийлдэг бөгөөд гаргаж авалт хэзээ ч хараагүй өөрчлөлтөд юу ч хийдэггүй.
Устгалд бүртгэл хэрэгтэй, дүгнэлт биш
Одоо ч байгаа мөрүүдийг харьцуулах нь аль түлхүүр алга болсныг хэрэглэгчид хэлж чадахгүй. Устгалыг хэзээ ч бүртгэдэггүй эх сурвалж танд хоёр дутуу сонголт үлдээдэг: ялгаа гаргахад хангалттай урт түлхүүрийн түүх хадгалах, эсвэл хуваарийн дагуу тодорхой бүрэн тохиролцоо хийх. Хоёулаа зардалтай зохион бүтээлийн шийдвэр бөгөөд хэн нэгэн эзэмшихгүй бол аль нь ч оршин тогтнохгүй.
Хадгалалт ч ижил төрлийн шийдвэр. Дэмжигдсэн өөрчлөлтийн урсгал бүр цонхтой; түүнийг гэрээнд зааж, хэрэглэгчийн хяналтын цэг түүнд ойртох үед анхааруул. Хоёр долоо хоногийн тасалдалын дараа сэрсэн хэрэглэгч дуугүй хэсэгчилсэн багц авахын оронд "дахин эхлүүлэлт шаардлагатай" гэсэн тодорхой алдаа унших ёстой.
Дараа нь дельта үнэ цэнэтэй байсан эсэхийг хэмж
Бүх түлхүүр, хэшийг харьцуулах руу буцах нь заримдаа зөв бөгөөд зардлыг нь мэдэх нь үнэ цэнэтэй. Та мөр бүрийн мэдээллийг дамжуулсар байгаа, хэшүүд хүснэгт хоорондын тууштай snapshot өгдөггүй, хэш схем нь дүрслэл, мөргөлдөөний талаар өөрийн асуултуудыг авчирдаг. Шалгаж болох хил бүхий цөөн байт бол зорилго; коммит болсон өөрчлөлтийг дуугүй унагадаг цөөн байт бол дельта огт биш.
Сүүлчийн өөрчлөлтийн багана бол сануулга. Хожуу коммит, устгал, урт тасалдалыг даван тулсан курсор бол гэрээ.