Bagaimana Anda menguji kondisi balapan di basis data?


30

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.


Maksud "kondisi ras", maksud Anda "jalan buntu"?
Gayus

2
@ Gayus ... tidak, meskipun saya yakin itu adalah salah satu hasil dari beberapa kondisi balapan
xenoterracide

Kondisi ras @ Gayus dalam database akan melakukan hal-hal seperti menjatuhkan tabel sebelum dibuat atau memperbarui baris sebelum dimasukkan. Secara umum saya akan membayangkan bahwa itu ditangani oleh logika aplikasi di luar database itu sendiri.
Mark D

memperbarui baris sebelum dimasukkan? itu tidak akan menyebabkan masalah db. tidak ada kondisi perlombaan seperti mengambil baris, dan memperbaruinya, tetapi meminta pengguna lain memperbaruinya setelah baris Anda diambil tetapi sebelum pembaruan Anda diproses.
xenoterracide

1
@MarkD - Tidak. Ada banyak jenis kondisi lomba yang muncul karena salah merangkum unit kerja atom dalam database Anda. Ini sebuah contoh. Ingat, "kondisi ras atau bahaya lomba adalah cacat dalam sistem atau proses elektronik di mana output atau hasil proses secara tak terduga dan kritis tergantung pada urutan atau waktu acara lainnya ." ( sumber )
Nick Chammas

Jawaban:


11

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 .


4

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 ;-)


dapatkah Anda memberikan contoh langkah demi langkah? dan dapatkah tes terprogram ditulis untuk melakukan hal yang sama?
xenoterracide

1

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

Mulai Proses 2. >>                            
Keterlambatan untuk mengizinkan 2 melakukan itu berhasil. 
. Kunci baris atau ubah data.
. Keterlambatan untuk mengizinkan 1 melakukan itu berhasil.
Mencoba untuk mengunci baris atau mengubah data. .
Periksa untuk memastikan penanganan yang tepat dilakukan. .
Berakhir. .
                                                Berakhir.

Adalah baik untuk melihat pemikiran tentang bagaimana menangani kondisi balapan dan yang lebih penting bagaimana unit mengujinya.


Saya tidak akan mendeskripsikan tes seperti itu sebagai unit test, karena unit test harus berjalan dengan cara yang persis sama setiap waktu. Kondisi ras gagal proses yang terlibat sebentar-sebentar, tidak dengan cara yang persis sama setiap kali
AK

@AlexKuznetsov Anda benar bahwa kondisi balapan yang tidak terduga dapat menunjukkan diri sesekali, namun OP mengacu pada kondisi yang diharapkan, ia yakin kode tersebut akan ditangani. Kondisi khusus ini dapat direproduksi secara tepat dan penanganan diverifikasi dengan uji unit.
Leigh Riffel

-2

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.


@darioo lol Saya pikir mungkin wn adalah akronim untuk sesuatu ... idk apa yang dia maksud dengan "jangan mengunci sendiri" Jika dia tidak berarti dengan ORM, saya memeriksa kode output ORM saya itu pasti tidak melakukan mengunci dengan benar. Yang merupakan salah satu alasan saya ingin dapat menguji skenario kondisi balapan potensial.
xenoterracide

Ya saya maksudkan sendiri, dan biasanya driver basis data menangani penguncian, baris, tabel, atau mungkin bidang, tetapi saya hanya membuka kemungkinan bahwa Anda menggunakan beberapa DB yang tidak menangani penguncian;)

.. Saya cukup yakin jika saya memiliki beberapa transaksi pernyataan bahwa DB saya tidak akan tahu baris mana yang harus dikunci secara otomatis ... hal-hal seperti select for updatetidak akan ada jika memang ada ...
xenoterracide
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.