Tôi có một bảng được gọi là tblOrderNumber có 1 hàng và 1 cột. Bảng này lưu trữ số thứ tự tiếp theo sẽ là gì cho trang web thương mại điện tử của tôi. Đó là VITAL TUYỆT VỜI rằng cùng một số thứ tự không được sử dụng nhiều lần. Hiện tại nhóm đang sử dụng quy trình được lưu trữ này và có vẻ như hoạt động tốt:
Câu hỏi của tôi là UPDLOCK có đảm bảo điều này không? Tôi cũng đã nghĩ rằng Khóa Đọc cũng được yêu cầu trên CHỌN (trong trường hợp không chắc là 2 đơn hàng được đặt trong một phần nghìn giây của nhau và đơn hàng đầu tiên chưa thực hiện CẬP NHẬT trước khi đơn hàng thứ hai thực hiện CHỌN, như tôi hiểu không có khóa đọc trong thủ tục này)?
DECLARE @NextOrderNumber INT
BEGIN TRANSACTION
SELECT @NextOrderNumber = NextOrderNumber
FROM tblOrderNumber (UPDLOCK)
UPDATE tblOrderNumber
SET NextOrderNumber = NextOrderNumber + 1
COMMIT
SELECT @NextOrderNumber
- Triển khai khách hàng (UPDLOCK HOẶC SERIALIZABLE sẽ tốt hơn ở đây vì tôi không nghĩ chúng ta cần khóa toàn bộ bảng?)
UPDATE dbo.tblOrderNumber WITH (SERIALIZABLE) SET @NextOrderNumber = NextOrderNumber, NextOrderNumber = NextOrderNumber + 1; WHERE CustomerId=@CustomerId
Tôi đang sử dụng SQL Server 2014 nhưng tôi sẽ sớm thay đổi thành SQL Azure.