Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mencegah transaksi simultan dalam aplikasi web

Saya senang Anda menyadari bahwa ini hanya solusi yang buruk dan sementara dan Anda harus mengoptimalkan kode Anda. Lupakan token dan barang-barang Anda. Cara termudah dan masih efisien mungkin adalah dengan memiliki kunci file eksklusif pada file bersama per operasi. Anda dapat membayangkan ini seperti sepotong kayu dan hanya satu yang dapat memegang id dan hanya yang memegangnya yang diizinkan untuk berbicara atau melakukan sesuatu.

<?php
    $fp = fopen("/tmp/only-one-bed-available.txt", "w+");

    if (flock($fp, LOCK_EX)) { // do an exclusive lock

         // do some very important critical stuff here which must not be interrupted:
         // sleeping.
         sleep(60);
         echo "I now slept 60 seconds";
        flock($fp, LOCK_UN); // release the lock
    } else {
        echo "Couldn't get the lock!";
    }

    fclose($fp);
?>

Jika Anda menjalankan skrip ini 10 kali paralel, akan memakan waktu 10 menit untuk menyelesaikannya (karena hanya ada satu tempat tidur yang tersedia!) dan Anda akan melihat gema "Saya sekarang tidur..." setiap 60 detik (kurang-lebih).

Ini membuat serial SEMUA eksekusi kode ini SECARA GLOBAL. Ini mungkin bukan yang Anda inginkan (Anda menginginkannya berdasarkan per pengguna, bukan?) Saya yakin Anda memiliki sesuatu seperti ID Pengguna, jika tidak gunakan Alamat IP asing , dan memiliki nama file unik untuk setiap pengguna:

<?php $fp = fopen("/tmp/lock-".$_SERVER["REMOTE_ADDR"].".txt", "w+"); ?>

Anda juga dapat menentukan nama file kunci untuk sekelompok operasi. Mungkinkah pengguna dapat melakukan beberapa hal secara paralel tetapi hanya operasi ini yang membuat masalah? Beri tag dan sertakan ke dalam nama file kunci!

Latihan ini sebenarnya tidak terlalu buruk dan bisa digunakan! Hanya ada sedikit cara untuk melakukannya lebih cepat (internal mysql, segmen memori bersama, serialisasi pada lapisan yang lebih tinggi seperti penyeimbang beban...)

Dengan solusi yang diposting di atas, Anda dapat melakukannya di aplikasi Anda yang mungkin bagus. Anda juga dapat menggunakan skema yang sama di Mysql:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-lock

Tetapi implementasi PHP mungkin lebih mudah dan lebih baik untuk kasus penggunaan Anda.

Jika Anda benar-benar ingin mencari solusi yang lebih elegan, lihat saja fungsi ini http://www.php.net/manual/en/function.sem-get.php



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memasukkan Formulir HTML $_POST Array Ke MySQL Menggunakan Implode

  2. MYSQL dan kesalahan python

  3. Conditional ON DUPLICATE KEY UPDATE (Update hanya jika kondisi tertentu benar)

  4. Tidak dapat terhubung ke server MySQL lokal melalui soket '/var/run/mysqld/mysqld.sock' di Ubuntu 12.04.5 LTS

  5. Permintaan sql tunggal umum