2009-01-14 28 views
5

Tôi đang gặp một vài vấn đề khi mọi người đang cố truy cập cơ sở dữ liệu MySQL và họ đang cố gắng cập nhật các bảng có cùng thông tin.Khóa cơ sở dữ liệu MySQL để chỉ một người cùng một lúc có thể chạy truy vấn?

Tôi có trang web được viết bằng PHP. Trong trang web này là một truy vấn để kiểm tra xem một số dữ liệu đã được nhập vào cơ sở dữ liệu chưa. Nếu dữ liệu không có, sau đó tôi tiến hành chèn nó. Vấn đề là nếu hai người cố gắng cùng một lúc, kiểm tra có thể nói rằng dữ liệu chưa được nhập nhưng khi việc chèn diễn ra nó đã được người khác.

Cách tốt nhất để xử lý trường hợp này là gì? Tôi có thể khóa cơ sở dữ liệu để chỉ xử lý các truy vấn của tôi trước rồi không?

Trả lời

1

Bạn đang tìm kiếm LOCK.

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

này có thể được chạy như một đơn giản mysql_query (hoặc MySQLi::query/prepare).

Tôi muốn nói tốt hơn là khóa các bảng cụ thể (mặc dù bạn có thể thử LOCK TABLES *) cần được khóa thay vì toàn bộ cơ sở dữ liệu - vì không có gì có thể đọc được. Tôi nghĩ rằng bạn đang tìm kiếm cái gì đó như:

LOCK TABLES items; 
START TRANSACTION; 
INSERT INTO items (name, label) VALUES ('foo', 'bar'); 
UNLOCK TABLES; 

Hoặc trong PHP:

mysql_query('LOCK TABLES items'); 
mysql_query("INSERT INTO items (name, label) VALUES ('foo', 'bar')"); 
mysql_query('UNLOCK TABLES'); 
0

Bạn có thể kiểm tra xem dữ liệu đã được thay đổi trước khi bạn chỉnh sửa một cái gì đó. Trong trường hợp đó nếu ai đó đã chỉnh sửa dữ liệu trong khi người khác đang chỉnh sửa, người đó sẽ được thông báo về điều đó.

Loại ngăn xếp như ngăn xếp xử lý bình luận.

5

Đọc trên database transactions. Đó có lẽ là cách tốt hơn để xử lý những gì bạn cần hơn là chạy BẢNG LOCK.

3

Bàn khóa thủ công là điều tồi tệ nhất bạn nghĩ có thể làm. Điều gì sẽ xảy ra nếu mã mở khóa chúng không bao giờ chạy (vì PHP không thành công, hoặc người dùng tiếp theo nhấp vào bước tiếp theo, bỏ đi khỏi PC, v.v.).

Một cách để giảm thiểu điều này trong ứng dụng web và một nhà phát triển sai lầm thường gặp là phải có một hộp dữ liệu đầy đủ các hộp văn bản để chỉnh sửa, với nút lưu trên mỗi hàng hoặc trên toàn bộ bảng. Rõ ràng nếu người đó mở cửa vào thứ Sáu và trở lại vào thứ Hai, dữ liệu có thể sai và họ có thể lưu trên dữ liệu mới. Một cách dễ dàng để sửa lỗi này là thay vào đó có các nút EDIT trên mỗi hàng và nhấp vào nút rồi tải biểu mẫu chỉnh sửa, theo cách này, họ hy vọng tải dữ liệu mới và chỉ có thể gửi 1 thay đổi hàng tại một thời điểm. Tuy nhiên, quan trọng hơn, bạn nên bao gồm trường datetime làm hộp nhập ẩn và khi họ cố gắng xem dữ liệu vào ngày và quyết định dữ liệu cũ bao nhiêu và đưa ra quyết định về độ tuổi quá cũ và để cảnh báo hoặc từ chối người dùng về hành động của họ.

Các vấn đề liên quan