Skenario saya umum: Saya memiliki prosedur tersimpan yang perlu memperbarui beberapa tabel. jika salah satu pembaruan gagal - semua pembaruan harus dibatalkan. jawaban yang tepat adalah dengan memasukkan semua pembaruan dalam satu transaksi dan hanya membatalkannya. namun, dalam sistem seperti milik kita, hal ini akan menyebabkan masalah konkurensi. ketika kami memecah pembaruan menjadi beberapa transaksi singkat - kami mendapatkan throughput ~30 eksekusi bersamaan per detik sebelum dan masalah kebuntuan mulai muncul. jika kita memasukkannya ke satu transaksi yang mencakup semuanya - kita mendapatkan ~2 per detik sebelum kebuntuan muncul.
dalam kasus kami, kami menempatkan blok coba-tangkap setelah setiap transaksi singkat, dan secara manual MENGHAPUS/Memperbarui kembali perubahan dari yang sebelumnya. jadi pada dasarnya kami meniru perilaku transaksi dengan cara yang sangat mahal... Ini berfungsi dengan baik karena ditulis dengan baik dan tidak mendapatkan banyak "kemunduran"... satu hal yang tidak dapat diselesaikan oleh pendekatan ini sama sekali adalah kasus batas waktu perintah dari web server / klien.
Saya telah membaca secara ekstensif di banyak formulir dan blog dan memindai melalui MSDN dan tidak dapat menemukan solusi yang baik. banyak yang telah menyampaikan masalahnya tetapi saya belum melihat solusi yang baik.
Pertanyaannya adalah ini: apakah ada solusi APA PUN untuk masalah ini yang memungkinkan pengembalian pembaruan yang stabil ke beberapa tabel, tanpa perlu membuat kunci eksklusivitas pada semua baris selama seluruh durasi transaksi panjang.
Asumsikan bahwa ini bukan masalah optimasi. Tabelnya mungkin hampir mencapai optimasi maksimal, dan dapat memberikan throughput yang sangat tinggi selama kebuntuan tidak terjadi. tidak ada kunci tabel/kunci halaman dll. semua baris terkunci pada pembaruan - tetapi ketika Anda memiliki begitu banyak sesi bersamaan, beberapa di antaranya perlu memperbarui baris yang sama...
bisa melalui SQL, sisi klien C#, sisi server C# (memperluas server SQL?). Apakah ada solusi seperti itu di buku/blog yang belum saya temukan?
kami menggunakan SQL server 2008 R2, dengan klien .NET/server web yang terhubung dengannya. Contoh kode:
Buat prosedur sptest Mulai transaksi Perbarui tabel1 Perbarui tabel2 Komit transaksi
Dalam kasus ini, jika sptest dijalankan dua kali, instance kedua tidak dapat memperbarui tabel 1 hingga instance 1 dikomit. Dibandingkan dengan ini
Buat sptest2 Perbarui tabel1 Perbarui tabel2
Sptest2 memiliki throughput yang jauh lebih tinggi - tetapi memiliki peluang untuk merusak data. Inilah yang kami coba selesaikan. Apakah ada solusi teoretis untuk hal ini?
Terima kasih, JS