2012-08-29 43 views
5

Script 1.Khóa mysql bảng với php

$query_ = "lock tables test1 as test11 write"; 
mysql_query($query); 
$query_ = "select * from test11"; 
sleep(20); 
$query_ = "unlock tables"; 
mysql_query($query_); 

Script 2.

$query_ = "select * from test1"; 
$result = mysql_query($query_); 

Vấn đề là nếu tôi chạy kịch bản thứ hai trong khi chạy kịch bản đầu tiên. Bảng không bị khóa. Và tôi có thể đọc bất kỳ dữ liệu nào từ nó.

Tôi cần nó bị khóa và trả lại lỗi.

Cách thực hiện công việc này?

+0

Nó có thể không giúp trả lời câu hỏi của bạn, nhưng bạn nên ngừng sử dụng các hàm 'mysql_ *'. Chúng không được chấp nhận. Thay vào đó hãy sử dụng [PDO] (http://php.net/manual/en/book.pdo.php) (được hỗ trợ từ PHP 5.1) hoặc [mysqli] (http://php.net/manual/en/book. mysqli.php) (được hỗ trợ từ PHP 4.1). Nếu bạn không chắc chắn nên sử dụng cái nào, hãy đọc bài viết này (http://www.deprecatedphp.com/mysql_/). – Matt

+0

Tôi tin rằng bảng sẽ chỉ bị khóa cho trường hợp kết nối mysql cụ thể đó. Tôi nghĩ rằng nó hoạt động theo cách này để ngăn chặn điều kiện chủng tộc. – Travesty3

+0

ý nghĩa của việc khóa nó cho kết nối mysql cụ thể là gì? Tại sao kịch bản của tôi muốn chèn một cái gì đó khi tôi không chèn bất cứ điều gì? –

Trả lời

5

Bạn đang read khóa bảng với $query_ = "lock tables test1 as test11 read"; - điều đó có nghĩa rằng các truy vấn khác vẫn có thể đọc nó mà không có bất kỳ vấn đề gì-để-bao giờ hết (liên quan link - di chuyển xuống phần trên các loại khóa):

Thông tin về loại khóa read:

  • Phiên giữ khóa có thể đọc bảng (nhưng không viết).
  • Nhiều phiên có thể lấy khóa READ cho bảng cùng một lúc.
  • Các phiên khác có thể đọc bảng mà không cần có khóa READ.

Nếu bạn muốn dừng bất cứ điều gì khác quá nhiều như Reding bảng, bạn cần phải sử dụng một khóa write như sau:

$query_ = "lock tables test1 as test11 write"; 
+1

Tôi thay đổi công cụ sửa đổi thành "write" vẫn là tập lệnh thứ hai trả về tất cả các bản ghi. –

+0

kiểm tra ví dụ của tôi tôi đã thay đổi để viết. vẫn giống nhau. đọc mọi thứ tốt đẹp. tự mình thử, bạn sẽ thấy nó không hoạt động. –

+0

@ pain.reign Khóa trên bàn là phiên cụ thể, đây có phải là câu hỏi tùy ý (hay hay) hoặc bạn đang cố gắng mô phỏng giao dịch trên các bảng mà bạn đang khóa? – Fluffeh

7

Nếu bạn không muốn người khác truy cập vào bảng sau đó sử dụng

LOCK TABLES test1 WRITE; 

Tập lệnh khác sẽ không trả về lỗi nhưng sẽ đợi cho đến khi khóa được giải phóng.

Hy vọng điều này sẽ giúp ...

+0

Tôi đã thử nó. Vẫn không khóa bất cứ thứ gì. Tập lệnh thứ hai có thể dễ dàng truy cập dữ liệu. –

+1

Dường như từ tập lệnh đầu tiên của bạn, trước tiên bạn đang đặt khóa viết trên test1 thì bạn đang thực hiện truy vấn, sau đó ngủ trong 20 giây, sau đó mở khóa bảng. Cho đến khi bạn mở khóa, tập lệnh thứ hai đang chờ bàn mở khóa. Ngay sau khi mở bảng, truy vấn trong tập lệnh thứ hai được truy cập vào bảng và nó sẽ trả về dữ liệu. Hãy thử tăng thời gian ngủ lên 100 hoặc 200 và sau đó kiểm tra kết quả. – Shubhansh

2

Bạn phải cấp quyền của bảng khóa cho người dùng db.

0

Nếu mã trong câu hỏi thực sự là mã đang được sử dụng, có lỗi đánh máy. Cuộc gọi đầu tiên tới mysql_query() đang truyền vào một biến khác. Bạn rời khỏi '_' ở cuối tên biến. Ngoài ra, bạn có một quan niệm sai lầm về những gì ổ khóa làm. Khóa không ngăn các tập lệnh khác truy cập dữ liệu và không khiến chúng bị lỗi. Khi tập lệnh 2 cố gắng truy cập hoặc sửa đổi dữ liệu mà nó không được phép vì khóa, nó sẽ tạm dừng và chờ khóa được giải phóng. Sau khi tập lệnh 1 mở bảng, tập lệnh 2 sẽ tiến hành và hoàn tất mà không gặp bất kỳ sự cố nào.

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