Sambil membuka-buka source beliau mulai bercerita bahwa stored procedure nya yang telah beliau set chained mode nya menjadi anymode (bisa chained, bisa juga unchained) dengan harapan sifat procedure dalam menangani variable bisa lebih flexible ternyata masih menyisakan misteri yang agak (ya memang sekedar agak, karena aku tahu kapasitas beliau) sulit untuk dipecahkan.
Jadi begini, beliau punya dua stored procedure. Satu stored procedure dipanggil oleh stored procedure yang lainnya. Gambarannya bisa dilihat pada frame berikut:
- declare proc...
- .
- .
- begin
- set chained on
- end
- .
- .
- .
- begin transaction alltran
- begin
- call my_sp (@status)-->sp ini ada transaksi insert, tidak mengandug commit di dalamnya
- if @status = -1
- begin
- rollback
- raise error
- return(1) -->return error
- end
- end
- insert ...
- if @@rowcount > 0 and status != -1 -->commit di sini.
- begin
- commit tran
- return(0)
- end
- else
- begin
- rollback
- return(1)
- end
Dan beliau cerita juga bahwa beberapa test yang beliau lakukan terhadap stored procedurenya, memberikan pesan kesalahan bahwa seakan dalam stored procedure beliau ada rollback/commit yang tidak didahului dengan begin. Padahal, menurut beliau dan sesuai penglihatanku juga, semua sudah setangkup. Gak ada yang nyelonong sendirian. Hasil test memberikan pesan bahwa commit/rollback tidak didahului oleh save point. Dan lebih jauh lagi, ternyata, setelah menjalankan/call my_sp dan secara keseluruhan stored_procedure seharusnya rollback, ternyata insert yang dijalankan oleh my_sp tetap commit.
Save point, aku yang lebih banyak berkutat dengan masalah replikasi, awalnya, nangkepnya save point itu sama dengan check point (setelah masalah terselesaikan, dalam hati, kemudian, aku tertawa ngikik, karena sok tahu menyamakan save point sama check point). Ya aku bilang, apa hubungannya dengan stored procedure. Tambah lagi, example save point yang didapat juga bunyinya 'save transaction precentagesave'. Vvvh.., masa harus ngukur persentasi proses yang mau disimpan di log sih?
Setelah puter otak kanan kiri dan ngomong ini ngomong itu dalam diskusi, akhirnya intuisiku berjalan. Save point, hmm... pastinya ini bukan masalah replikasi. Tetapi masalah session transaksi. Hmmm terus aku usul bagaimana kalau ada perubahan begini:
- declare proc...
- .
- .
- begin
- set chained on
- end
- .
- .
- .
- begin transaction alltran
- begin
- save transaction currTran
- call my_sp (@status)-->sp ini ada transaksi insert, tidak mengandug commit di dalamnya
- if @status = -1
- begin
- rollback currTran
- raise error
- return(1) -->return error
- end
- end
- insert ...
- if @@rowcount > 0 and status != -1 ->commit di sini.
- begin
- commit tran
- release currTran
- return(0)
- end
- else
- begin
- rollback tran
- release currTran
- return(1)
- end
Setelah ditambahkan beberapa baris seperti di atas, akhirnya masalah terpecahkan. Eksekusi nested stored procedure my_sp seperti di dalam contoh sudah bisa terkontrol sepenuhnya dengan menerapkan save point yang bukan check point. Kesimpulannya, karena tidak menerapkan save point maka nested procedure yang secara anatominya memakai satu blok tersendiri, maka, bila aplikasi menerapkan autocommit dalam mengeksekusi stored procedure induknya, nested stored procedure secara otonom akan menginsert dan commit tanpa mengabaikan rule yang didisain dalam mengeksekusi stored procedure tersebut. Oleh karena proses telah di commit, maka proses rollback akan memberikan pesan kesalahan. Untuk itulah maka diperlukan save point yang akan memegang status transaksi.
Itu aja. He he he...