2017-09-15 64 views
2

我有我的SQL Server數據庫中的表,其中包含有關書如低於預定的截圖一些數據:管理併發

+----+-------+-------+--------+ 
| Id | Title | Price | Status | 
+----+-------+-------+--------+ 
| 1 | C#6 | 40.00 |  0 | 
+----+-------+-------+--------+ 

Status列指示書的可用性借款( 0 =可用,1 =借用)

讓我們假設2個或更多的用戶在我的web應用程序中看到了這本書,並且這些用戶正試圖在同一時間借閱本書,而沒有管理併發性,我們將爲除用戶#1之外的其他用戶。

我知道,我們可以使用SQL交易並隔離級別一樣Serializable,以確保沒有更多的用戶使用的是相同的數據在同一時間,但在這裏,我有幾個問題:

  1. 這是這種情況的最佳做法嗎?如果沒有,請分享您的建議。
  2. 如果是這樣,那麼其他用戶又該怎麼辦呢?在用戶#1拿到這本書借用後應該得到什麼?而且,在最終確認之後或之前處理最終級別的併發性是否好?

回答

4

在這種情況下的最佳實踐是樂觀的併發性。在表格中添加rowversion列並檢查更新時值是否從原始值發生變化:

CREATE TABLE dbo.Book(
     Id int NOT NULL CONSTRAINT PK_book PRIMARY KEY 
    , Title varchar(30) NOT NULL 
    , Price decimal(9,2) NOT NULL 
    , Status bit NOT NULL 
    , row_version rowversion NOT NULL 
    ); 

INSERT INTO dbo.Book (Id, Title, Price, [Status]) 
    VALUES(1, 'C# 6', 40.0, 0); 
GO 


CREATE PROC dbo.UpdateBookAvailability 
     @Id int 
    , @Rowversion rowversion 
    , @Status bit 
AS 
UPDATE dbo.Book 
SET Status = @Status 
WHERE 
    Id = @Id 
    AND row_version = @RowVersion; 
IF @@ROWCOUNT < 1 
BEGIN 
    RAISERROR('book not avaiable', 16, 1); 
END; 
GO