2017-09-15 63 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