2013-02-22 21 views
5

Tôi đã tò mò về cách PHP script và MySQL hoạt động? Kịch bản về cơ bản là hai truy vấn SQL.Điều gì xảy ra khi một tập lệnh PHP truy cập cơ sở dữ liệu MySQL cùng một lúc, nhiều lần?

SELECT đầu tiên và nhận số từ một cột của một hàng cụ thể do một số id quyết định.

Sau đó, nếu số dương thì cột CẬP NHẬT thứ hai bằng cách trừ đi một số tiền nhất định.

Rõ ràng đây là một trường hợp cổ điển mà tôi sẽ sử dụng giao dịch hoặc khóa hoặc mutexes hoặc những gì trên.

Câu hỏi của tôi là: Trong một trang web hoàn toàn có thể cho hai hoặc nhiều người dùng gọi tập lệnh cùng một lúc cho cùng một hàng. Nếu bạn không sử dụng các giao dịch hoặc các bảng khóa, PHP sẽ xử lý như thế nào? Họ là hai truy vấn/cuộc gọi chức năng nhưng họ đang ở trong một kịch bản. Liệu nó có chờ đợi toàn bộ kịch bản quay lại người dùng tương ứng để chạy lại cho người dùng khác hay vì họ là các truy vấn khác vì giả tạo nó có thể chạy truy vấn đầu tiên trên nhiều người dùng gọi cùng một tập lệnh và sau đó là lần thứ hai cho một tập hợp khác. Về cơ bản tôi hỏi vì tôi đang làm một cái gì đó mà tôi không có đủ quyền để sử dụng giao dịch hoặc khóa và tôi muốn biết nếu tôi có thể tránh một mutex (tôi không chắc chắn về từ này, về cơ bản là một bảng mới cho người gọi, trước khi gọi kịch bản ở trên, tôi sẽ gọi một kịch bản mới trước đó, nơi tôi sẽ biến cột boolean của bảng đúng cho văn bản để người khác không thể trong khi kịch bản gốc kết thúc và sau đó bacl thành false để tiếp theo trong dòng có thể làm và như vậy)

Chỉnh sửa: Tôi không chắc chắn về việc chọn để cập nhật cho dù các điều khoản cho được bao gồm trong nêu trên. Người đàn ông chịu trách nhiệm trả lời các câu hỏi của tôi khó tìm và tôi đã tìm nó với tôi ...

Trả lời

1

Thật lạ khi bạn có thể cập nhật, nhưng không thể khóa bảng (cập nhật là bảng khóa cho một số công cụ và khóa các hàng khác). Nhưng nếu bạn thực sự không thể khóa đó là cách bạn có thể sử dụng get_lock function. Nó hoạt động như mutex.

P.S. Nếu bạn đang sử dụng bản cập nhật chỉ với bài tập (set a=10), bạn có thể mất một số dữ liệu. Nếu bạn sử dụng chuyển nhượng với ref trên nộp (set a=10+a) nó không bao giờ xảy ra.

+0

Vâng, vừa nhận được câu trả lời rằng tôi CÓ thể khóa bảng ... vì vậy bạn đã đúng. Đối với P.S đó thực sự là những gì tôi đang làm; sử dụng một tham chiếu trên cột (free = free - {$ diff}) –

+0

Vì vậy, bây giờ tôi biết tôi có thể sử dụng SELECT ... FOR UPDATE. Bạn có biết cách làm việc này không. Cách tôi hiểu nó nó khóa các hàng của kết quả (từ truy vấn chọn) cho cả đọc (chọn) và viết (cập nhật) nhưng tôi không chắc chắn khi nó phát hành chúng ... Sau khi cập nhật tiếp theo trên những hàng này? –

+1

CHỌN ... ĐỂ CẬP NHẬT chỉ hoạt động trong các giao dịch. Nó sẽ khóa các hàng cho đến khi kết thúc giao dịch. – sectus

0

Bạn không thể làm điều đó trong một cuộc gọi, theo cách đó nó sẽ không thành vấn đề quá nhiều?

UPDATE T1 
    SET T1.COLUMN = T2.COLUMN - 4 
    FROM TABLE1 AS T1 
    INNER JOIN TABLE2 AS T2 
     ON T1.COLUMN = T2.COLUMN 
    WHERE T2.COLUMN = ID 
    AND T2.COLUMN > 0 
+0

cũng thực sự tôi đã đơn giản hóa quá trình bởi vì đối với câu hỏi cốt lõi bạn không cần phải biết chi tiết của kịch bản. Đủ để nói rằng tôi đã nghĩ về điều đó và nó sẽ là một truy vấn rất lớn và phức tạp. Cảm ơn mặc dù :) –

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