Saya mencoba menulis kode basis data untuk memastikan bahwa itu tidak tunduk pada kondisi balapan, untuk memastikan bahwa saya telah mengunci baris atau tabel yang benar. Tetapi saya sering bertanya-tanya: Apakah kode saya benar? Apakah mungkin untuk memaksakan kondisi balapan yang ada terwujud? Saya ingin memastikan bahwa jika hal itu terjadi di lingkungan produksi, aplikasi saya akan melakukan hal yang benar.
Saya biasanya tahu persis query bersamaan yang mana yang mungkin menyebabkan masalah, tetapi saya tidak tahu bagaimana memaksa mereka untuk menjalankan secara bersamaan untuk melihat apakah perilaku yang benar terjadi (misalnya saya menggunakan jenis kunci yang benar), bahwa kesalahan yang tepat adalah dibuang, dll.
Catatan: Saya menggunakan PostgreSQL dan Perl, jadi jika ini tidak dapat dijawab secara umum, mungkin harus dipaget ulang.
Pembaruan: Saya lebih suka jika solusinya terprogram. Dengan begitu saya bisa menulis tes otomatis untuk memastikan tidak ada regresi.
sumber
Jawaban:
Saya selalu melakukannya dengan modul T-SQL saya.
Pada dasarnya, yang perlu Anda lakukan adalah menjalankan modul dari dua atau lebih koneksi dalam satu lingkaran selama beberapa menit . Biasanya, semua masalah potensial terekspos dalam beberapa menit, dengan asumsi Anda memiliki kotak SQL Server dengan CPU yang layak.
Saya menulis beberapa contoh di sini dan di sini .
sumber
Saya biasanya bekerja dengan alat baris perintah RDBMS, hanya memiliki 2 (atau lebih) contoh CLI dimulai. Anda kemudian dapat memutar ulang satu per satu dan sebagai perlombaan (yang akan terlihat seperti action-RPG) pernyataan SQL yang dikirimkan lapisan aplikasi Anda. Anda harus bereksperimen / merasakan sistem penguncian dalam aksi karena CLI Anda akan "sedikit" menggantung, menunggu kunci dilepaskan dari CLI yang lain.
Jika ini terdengar jelas seperti lumpur, jangan ragu untuk mengatakannya ;-)
sumber
Kondisi Balapan membutuhkan beberapa utas eksekusi, oleh karena itu untuk menguji unit ini Anda harus dapat memulai satu utas atau lebih. Di Oracle saya akan menggunakan DBMS_Scheduler untuk menjalankan proses untuk mensimulasikan pengguna kedua. Jika PostgreSQL / Perl memiliki cara untuk memulai proses kedua secara terprogram, maka Anda harus dapat melakukan sesuatu seperti ini:
Proses 1 Proses 2
Adalah baik untuk melihat pemikiran tentang bagaimana menangani kondisi balapan dan yang lebih penting bagaimana unit mengujinya.
sumber
Selama Anda mengunci baris, Anda tidak boleh berada di kondisi lomba karena biasanya disebabkan ketika tidak ada penguncian.
Tapi Anda bisa menemui jalan buntu jika satu pertanyaan memblokir pertanyaan Anda terlalu lama.
Ini sulit untuk diuji karena waktu untuk kueri dapat berubah ketika database tumbuh.
Kueri yang berfungsi baik dengan 100.000 baris data uji keluar dari bagan dengan 10.000.000 baris.
Jenis masalah ini bisa sangat sulit ditemukan sebelumnya, tetapi banyak DB memiliki beberapa metode untuk mengidentifikasi permintaan yang lambat.
Dengan menggunakan regulator itu Anda harus dapat menjebak pertanyaan apa pun yang mengarah ke masalah dengan banyak peringatan.
Jika Anda mengunci sendiri, itu cerita lain, tapi di sana saya tidak bisa membantu.
sumber
select for update
tidak akan ada jika memang ada ...