2014-05-14 16 views
5

Giả sử rằng tôi có một bộ điều khiển với phương thức "UpdateRecord (int recordID)". Phương thức này được cho là cập nhật bản ghi đã cho chỉ một lần (bằng cách thiết lập giá trị appropiate để ghi trong cơ sở dữ liệu, giả sử nó là cột "IsLock"). Để kiểm tra xem tôi có:ASP.NET MVC có thực hiện các yêu cầu trong hàng đợi hay đồng thời

  1. Tải xuống bản ghi với bản ghi đã choID từ cơ sở dữ liệu.
  2. Kiểm tra xem bản ghi có giá trị "IsLock" được đặt thành FALSE hay không.
  3. Nếu IsLock == FALSE - cập nhật bản ghi trong cơ sở dữ liệu và đặt IsLock thành TRUE, nếu không - không cập nhật và trả về lỗi.

Vì vậy, bây giờ tôi tự hỏi điều gì sẽ xảy ra nếu tôi thực hiện hai yêu cầu AJAX cho phương thức này (với cùng một bản ghiID) một ofter khác. ASP.NET sẽ thực hiện yêu cầu thứ hai chỉ sau khi yêu cầu đầu tiên được thực hiện? Hoặc nó sẽ thực hiện đồng thời cả hai?

Để làm rõ hơn xin vui lòng cho tôi biết liệu tình huống này có thể:

  1. tôi làm yêu cầu đầu tiên (recordID = 555).
  2. Một phần nghìn giây sau, tôi thực hiện yêu cầu thứ hai (recordID = 555).
  3. Yêu cầu bản ghi được tải xuống lần đầu tiên với bản ghiID đã cho = 555, đã kiểm tra IsLock = FALSE, vì vậy, nó bắt đầu chuẩn bị truy vấn để cập nhật bản ghi.
  4. Yêu cầu thứ hai được tải xuống hồ sơ với recordID = 555, kiểm tra IsLock = FALSE, vì vậy nó bắt đầu chuẩn bị truy vấn để cập nhật bản ghi (IsLock là stilL FALSE, vì yêu cầu đầu tiên không có đủ thời gian để cập nhật cơ sở dữ liệu).
  5. Yêu cầu đầu tiên được cập nhật thành công.
  6. Yêu cầu thứ hai được cập nhật thành công (nhưng nó sẽ trả về lỗi vì một bản ghi chỉ có thể được cập nhật một lần).

Nếu có thể, vui lòng cho mi biết cách tôi có thể đảm bảo phương pháp ngăn chặn tình huống này xảy ra?

Trả lời

1

Trước hết, nó được xác định không chỉ bởi ứng dụng của bạn mà còn bởi các thiết lập IIS. Tôi nghĩ rằng this article sẽ giúp ích.

Để trả lời phần ADO.net - có một số loại kiểm soát đồng thời dữ liệu, bạn có thể đọc here (Data Concurrency in ADO.NET) về sự khác biệt và sử dụng mã phù hợp trong trường hợp của bạn.

Trong trường hợp của bạn với ổ khóa bạn đang đi để thay đổi truy vấn của bạn từ

update T set IsLock = 1 where recordID = 555 

để

update T set IsLock = 1 where recordID = 555 and IsLock = 0 

và kiểm tra giá trị trả về của cmd.ExecuteNonQuery() là 1 hoặc 0.

Trong trường hợp nó trả về 0 bản ghi đã không được cập nhật và khóa được thiết lập bởi người dùng khác, v.v.

Bạn cũng có thể muốn thêm LockerID trường để bàn của bạn để truy vấn của bạn sẽ trở thành

update T set IsLock = 1, LockerID = @userID where recordID = @recordID and IsLock = 0 

Vì vậy, khi mở bản ghi đầu tiên bạn sẽ thực hiện truy vấn khóa của bạn và nếu nó đã thành công bạn sẽ được tải kỷ lục và chương trình chỉnh sửa chế độ, nếu không hiển thị chế độ chỉ đọc.

+0

Tôi không muốn thay đổi ảnh hưởng đến toàn bộ ứng dụng của tôi. Tôi không có quyền truy cập vào cài đặt IIS. Tôi có thể làm gì? – Andrzej

+0

Đọc về http://msdn.microsoft.com/en-us/library/cs6hb8k4(v=vs.71).aspx – vittore

+0

Bạn đề xuất giải pháp thực sự nic, nhưng tôi lo lắng rằng việc thực hiện sẽ mất quá nhiều thời gian (Trong câu hỏi của tôi, tôi đã cung cấp ví dụ rất đơn giản). Có cách nào để buộc thực hiện các yêu cầu đối với phương thức cụ thể này trong hàng đợi không? – Andrzej

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