Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Ngăn chặn các giao dịch đồng thời trong một ứng dụng web

Tôi rất vui vì bạn nhận ra rằng đó chỉ là một giải pháp tạm thời và tồi tệ và bạn nên tối ưu hóa mã của mình. Bạn có thể tưởng tượng điều này giống như một miếng gỗ và chỉ một người có thể giữ id và chỉ ai giữ nó mới được phép nói chuyện hoặc làm điều gì đó.

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

Nếu bạn thực thi tập lệnh này song song 10 lần, sẽ mất 10 phút để hoàn thành (vì chỉ có một chiếc giường còn trống!) Và bạn sẽ thấy tiếng vọng "Bây giờ tôi đã ngủ ..." cứ sau 60 giây (khoảng).

Điều này tuần tự hóa TẤT CẢ các lần thực thi mã này TOÀN CẦU. Đây có thể không phải là những gì bạn muốn (bạn muốn nó trên cơ sở từng người dùng, phải không?) và có một tên tệp duy nhất cho mỗi người dùng:

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

Bạn cũng có thể xác định tên tệp khóa cho một nhóm hoạt động. Maby người dùng có thể làm một số công việc song song nhưng chỉ hoạt động này gây ra vấn đề? Đặt cho nó một thẻ và bao gồm nó trong tên tệp khóa anh ta!

Thực hành này thực sự không tệ và có thể được sử dụng! Chỉ có một số cách nhỏ để làm điều đó nhanh hơn (nội bộ mysql, phân đoạn bộ nhớ chia sẻ, tuần tự hóa trên lớp cao hơn như bộ cân bằng tải ...)

Với giải pháp được đăng ở trên, bạn có thể thực hiện nó trong ứng dụng của mình, điều này có thể tốt. Bạn cũng có thể sử dụng cùng một lược đồ trong Mysql: http://dev.mysql.com/doc/refman/5.0/en/mis Linh tinh-functions.html# Chức năng_get-lock

Nhưng việc triển khai PHP có lẽ dễ dàng hơn và tốt hơn cho trường hợp sử dụng của bạn.

Nếu bạn thực sự muốn có một giải pháp tuyệt vời hơn, chỉ cần xem chức năng này http://www.php.net/manual/en/ Chức năng.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. DataGridView không hiển thị các cột của tôi

  2. Cách tạo trình kích hoạt để xóa php myadmin

  3. Kết nối đăng ký Facebook

  4. sqlalchemy, đặt bộ mã MySQL làm đối số `create_engine`

  5. Nhận tệp kích thước 0KB trong khi sao lưu cơ sở dữ liệu mysql bằng cách sử dụng kết xuất mysql