Transfer antar-database mati ketika VPN putus, dan «jalankan lagi» bukan rencana pemulihan. Ekstraksi sumber mungkin sudah selesai, target mungkin sudah melakukan commit, atau balasannya mungkin saja hilang di perjalanan pulang. Ketiga keadaan itu membutuhkan tindakan berbeda, dan klien yang hanya mengenal «kesalahan» tidak dapat membedakannya.

Perbaikannya bersifat arsitektural: beri setiap eksekusi identitas batch yang tahan lama, dan biarkan database menjawab pertanyaan alih-alih membiarkan klien menebak.

Apa yang sebenarnya dijamin database

SQL Server dan Oracle keduanya memberikan atomisitas di dalam transaksi. Tidak ada yang memberi Anda atomisitas di antara keduanya. Koneksi yang hilang tidak merusak database dan juga tidak memaksa rollback manual, karena server menyelesaikan transaksinya sendiri tanpa Anda. Yang rusak adalah pengetahuan pemanggil tentang hasilnya.

Commit secara terpisah berarti commit secara terpisah. VPN yang membawa kedua koneksi tidak meleburkan dua commit menjadi satu unit kerja.

Commit yang tidak pernah Anda dengar

Satu mode kegagalan menghukum logika percobaan ulang yang naif: server melakukan commit, dan konfirmasi tidak pernah mencapai pemanggil. Oracle mendokumentasikan ini sebagai masalah hasil tak dikenal dan menyediakan Transaction Guard untuknya di dokumentasi transaksi. Kesalahan komunikasi bukan bukti bahwa commit yang dikirim gagal, dan memperlakukannya sebagai bukti adalah cara sebuah batch diposkan dua kali. Perbedaannya paling penting pada jalur percobaan ulang, ketika operator memiliki pesan kesalahan dan tidak ada sinyal lain untuk bertindak.

Jadi langkah pemulihan harus membaca hasil dari target alih-alih menyimpulkannya dari teks kesalahan.

Beri transfer identitas batch

Setiap eksekusi mendapat ID batch yang tidak berubah, dan target mencatat apa yang dilakukannya dengan ID itu. Siklus hidupnya empat langkah, dan tampak sama apa pun vendornya:

  1. Ekstrak batch sumber yang teridentifikasi dan tidak berubah dengan skema dan batas yang tercatat.
  2. Transfer ke area pementasan target dan deteksi isi yang tidak lengkap atau bertentangan sebelum menyatakannya siap.
  3. Terapkan di bawah aturan keunikan atau penguncian target sendiri dan catat penyelesaian dalam transaksi lokal yang sama.
  4. Rekonsiliasi hasil yang tahan lama melalui protokol yang didukung sebelum mengonfirmasi atau mencoba lagi.

Percobaan ulang memakai ID yang sama. ID baru per percobaan menggagalkan pencegahan duplikat yang baru saja Anda bangun, yang terdengar jelas sampai pembungkus percobaan ulang menghasilkannya secara otomatis.

ID itu juga memberi Anda sesuatu untuk direkonsiliasi nanti, lama setelah proses klien hilang.

Klaim batch, lalu terapkan

Langkah penerapan harus mengklaim ID batch, melakukan perubahan bisnis, dan mencatat penyelesaian dalam satu transaksi lokal. Melakukan pemeriksaan dan penyisipan sebagai pernyataan terpisah menghadirkan kembali perlombaan yang ingin Anda hilangkan. Jika dua pekerja berlomba, tepat satu klaim menang dan yang lain diberi tahu.

Catatan penyelesaian yang tidak ada bukan bukti bahwa transaksi yang sedang berjalan tidak akan pernah commit. Klaim harus menyerialkan upaya yang bersaing, atau protokol harus membaca hasil yang tahan lama sebelum memutuskan apa pun.

Gunakan mekanisme database yang didukung untuk serialisasi itu alih-alih perulangan periksa-lalu-ulangi di kode aplikasi.

Apa yang masih tidak dapat dijanjikan desain

Pementasan membuat pekerjaan dapat dimulai ulang dan mengurangi ketergantungan pada satu sesi berumur panjang. Itu tidak menciptakan satu commit atomik di seluruh SQL Server, Oracle, dan efek samping eksternal apa pun yang dilakukan pekerjaan. Jika bisnis benar-benar membutuhkannya, rancang dan kualifikasikan transaksi terdistribusi yang didukung atau proses rekonsiliasi, termasuk siapa yang memiliki pekerjaan yang hasilnya belum pasti. Apa pun yang lebih lemah dari itu berada di runbook rekonsiliasi, bukan di kode transfer.

Terima gangguan di tiga tempat: selama transfer, selama penerapan, dan setelah commit tetapi sebelum konfirmasi. Lalu periksa hasil bisnis alih-alih pesan klien, dan biarkan buku besar batch mengatakan apakah pekerjaan belum lengkap, sudah commit, atau masih belum terselesaikan.

Artikel terkait