Tôi có một cơ sở dữ liệu MySQL (InnoDB) mà tôi đang phát triển để theo dõi Đơn đặt hàng làm việc tại tổ chức của mình. Có nhiều 'trang web và mỗi trang web có số thứ tự công việc bắt đầu từ 100.
WorkorderID SiteID SiteWorkorderNum
1 1 100
2 1 101
3 2 100
WorkorderID là trường tăng tự động.
SiteID và SiteWorkorderNum đều được đặt làm một ràng buộc duy nhất.
Bất cứ khi nào một đơn đặt hàng công việc mới sắp được chèn cho một trang web cụ thể, ứng dụng sẽ kiểm tra tối đa (SiteWorkorderNum) cho trang web của bất kỳ ai đã đăng nhập và trả về giá trị đó cho câu lệnh chèn. Vấn đề tôi muốn tránh là nếu cả hai người dùng của cùng một trang đều nhập một đơn đặt hàng công việc mới cùng một lúc.
Tôi có một vài giải pháp khả thi nhưng tôi muốn xem liệu có cách nào tốt hơn vì mỗi cách đều có nhược điểm, nhưng tôi chắc chắn sẽ tốt hơn các giải pháp khác, và tất nhiên tôi mở ra cho những ý tưởng mới.
1) Khóa bảng để đảm bảo không có người dùng nào khác truy xuất giá trị SiteWorkorderNum cho đến khi chúng tôi đã truy xuất và chèn các giá trị của chúng tôi (tuy nhiên, giả sử chúng tôi có hàng ngàn người dùng cố gắng nhập đơn hàng công việc mỗi phút, liệu bảng có bị khóa không? )
2) Không khóa bảng và truy xuất SiteWorkorderNum tiếp theo và thử chèn vào cơ sở dữ liệu, nếu tôi nhận được một lỗi ràng buộc duy nhất, hãy bắt lỗi và thử lại cho đến khi tôi thành công. (điều này có thể giữ cho bảng được giải phóng, nhưng một lần nữa giả vờ rằng chúng ta có hàng ngàn người dùng trên cùng một trang, liệu nhiều cuộc gọi cơ sở dữ liệu có hơi kém hiệu quả không?)
Tôi có quá hoang tưởng về cách một trong hai giải pháp này 'có thể' thực hiện hiệu quả không? Tất nhiên tôi không có hàng ngàn người dùng, nhưng tôi muốn áp dụng thực tiễn tốt nhất trong thiết kế này trong trường hợp tôi từng làm việc trong một dự án có lưu lượng truy cập cao.