Saya pikir Anda mencoba menyelesaikan masalah dengan cara yang salah. Apa yang Anda inginkan adalah perlindungan terbaik terhadap konsistensi basis data. Jika dua orang menjalankan prosedur tersimpan pada saat yang sama, konsistensi basis data dapat dilanggar.
Untuk melindungi dari berbagai jenis ketidakkonsistenan basis data, standar SQL memiliki empat tingkat isolasi transaksi:
- BACA TIDAK DIKOMPITASI di mana pada dasarnya transaksi kehilangan nilainya, transaksi lain yang melihat data kotor. Jangan gunakan ini!
- BACA BERKOMITMEN di mana transaksi hanya melihat data yang dikomit, tetapi mungkin ada inkonsistensi di mana dua transaksi dapat melangkahi jari masing-masing
- BACA YANG DIULANGKAN di mana satu jenis ketidakkonsistenan, bacaan yang tidak dapat diulang, diselesaikan
- SERIALIZABLE yang menjamin bahwa ada beberapa tatanan virtual di mana melaksanakan transaksi akan menghasilkan hasil yang menghasilkan eksekusi mereka
Namun, standar SQL memiliki pendekatan berbasis penguncian untuk inkonsistensi basis data ini, dan untuk alasan kinerja banyak basis data mengambil pendekatan berbasis isolasi snapshot yang pada dasarnya memiliki level-level ini:
- BACA BERKOMITMEN yang sama dengan mengunci basis data
- ISOLASI SNAPSHOT di mana database melihat snapshot semua data dan jika mencoba memperbarui baris yang telah diperbarui oleh beberapa transaksi lain, itu dibatalkan, namun ada beberapa anomali terkenal yang dapat terjadi
- SERIALIZABLE yang sama dengan mengunci basis data, tapi kali ini diterapkan dengan cara yang berbeda, bukan dengan mengambil kunci tetapi dengan memastikan tidak ada pelanggaran serialisasi, dan jika pelanggaran tersebut terdeteksi, membatalkan transaksi
Pembatalan transaksi dalam database berbasis isolasi snapshot ini mungkin terdengar mengkhawatirkan, tetapi sekali lagi setiap database tunggal akan membatalkan transaksi karena jalan buntu, jadi aplikasi apa pun yang masuk akal tetap harus dapat mencoba kembali suatu transaksi.
Apa yang Anda inginkan adalah tingkat isolasi SERIALISASI : memastikan bahwa jika transaksi yang dilakukan secara independen satu sama lain menghasilkan keadaan yang baik, setiap eksekusi paralel dari transaksi juga menghasilkan keadaan yang baik. Untungnya, Michael Cahill dalam disertasi doktoralnya menemukan bagaimana tingkat isolasi SERIALIZABLE dapat didukung oleh database terisolasi snapshot dengan sedikit usaha.
Jika menggunakan tingkat isolasi SERIALIZABLE dalam database snapshot terisolasi, jika dua orang mencoba menjalankan prosedur yang tersimpan secara bersamaan dan mereka akan menginjak kaki masing-masing, salah satu transaksi akan dibatalkan.
Sekarang, apakah SQL Server benar-benar mendukung tingkat isolasi SERIALIZABLE (alih-alih menyamarkan isolasi snapshot di balik kata kunci SERIALIZABLE )? Sejujurnya, saya tidak tahu: satu-satunya database yang saya tahu yang mendukungnya adalah PostgreSQL.
Meskipun saya gagal memberikan saran khusus untuk SQL Server, saya tetap memposting jawaban ini, karena pengguna PostgreSQL dan pengguna database lain yang dapat mempertimbangkan beralih ke PostgreSQL dapat mengambil manfaat dari jawaban saya. Selain itu, pengguna basis data non-PostgreSQL yang tidak dapat beralih ke PostgreSQL dapat menekan vendor database favorit mereka untuk menawarkan tingkat isolasi asli SERIALIZABLE .