Tôi cần khóa toàn bộ bảng (không phải một hàng) với học thuyết, tôi muốn thực hiện điều này mà không có truy vấn gốc nếu có thể.Làm thế nào để khóa toàn bộ bảng trong symfony2 bằng doctrine2?
Các tài liệu cho pessimistic locking chỉ mô tả làm thế nào để khóa các đơn vị cụ thể thông qua các phương pháp:
- EntityManager # tìm
- EntityManager # khóa
- Query # setLockMode
Tôi có một giao dịch cần chèn một hàng có giá trị phụ thuộc vào giá trị của phần còn lại của các hàng trong bảng, vì vậy tôi cần phải ngăn hai giao dịch thực hiện đồng thời trên bàn đó.
Tôi đang sử dụng phân giới giao dịch rõ ràng, được cho là hoạt động tốt với khóa (theo tài liệu ở trên).
LƯU Ý: Khóa tối ưu không đủ tốt trong trường hợp này, tôi không thể đủ khả năng thử lại giao dịch. Bên cạnh đó truy vấn không được cho là chậm nên hiệu năng không phải là vấn đề.
EDIT: Tôi sẽ đưa ra một ví dụ. Hãy tưởng tượng bạn muốn tay xây dựng một auto_increment, và bạn phải chọn max() từ bảng để có được kết quả trước đó để chèn tiếp theo. Bạn phải đảm bảo rằng không có hai giao dịch nào cố gắng chèn cùng một giá trị trong trường hợp chúng chọn tối đa() cùng một lúc.
Tôi đang tìm giải pháp chung cho vấn đề này khi auto_increment không tốt, ví dụ với chuỗi hoặc nhiều cột, băm hoặc bất kỳ phép tính nào bạn phải thực hiện trên tập hợp hàng trước.
Khóa là giải pháp chắc chắn và không giống như khóa lạc quan, bạn không phải thử lại các lỗi.
Vì vậy, có cách nào để sử dụng tính năng khóa bảng trong học thuyết không?
Imo, một lựa chọn tốt hơn là nên mở một giao dịch, tìm nạp dữ liệu từ bảng bạn cần thông qua truy vấn chọn, sau đó thực hiện cập nhật. – JamesHalsall
Vấn đề là nếu một giao dịch thứ hai đến trước lần commit đầu tiên giao dịch thứ hai sẽ chèn một giá trị không hợp lệ. Kết quả của giao dịch thứ hai cũng phụ thuộc vào hàng được chèn bởi lệnh đầu tiên. Đó là lý do tại sao tôi cần khóa, giao dịch không được trùng lặp cho bảng đó. – Jens