Sql server 在SQL Server中管理并发性

Sql server 在SQL Server中管理并发性,sql-server,concurrency,isolation-level,sqltransaction,Sql Server,Concurrency,Isolation Level,Sqltransaction,我的SQL Server数据库中有一个表,其中包含一些有关书籍的数据,如下面给出的屏幕截图: +----+-------+-------+--------+ | Id | Title | Price | Status | +----+-------+-------+--------+ | 1 | C#6 | 40.00 | 0 | +----+-------+-------+--------+ 状态列指示可借阅图书的可用性(0=可用,1=已借阅) 假设有两个或多个用户在我的we

我的SQL Server数据库中有一个表,其中包含一些有关书籍的数据,如下面给出的屏幕截图:

+----+-------+-------+--------+
| Id | Title | Price | Status |
+----+-------+-------+--------+
|  1 | C#6   | 40.00 |      0 |
+----+-------+-------+--------+
状态
列指示可借阅图书的可用性(0=可用,1=已借阅)

假设有两个或多个用户在我的web应用程序中看到了这本书,并且这些用户同时试图借阅这本书,在不管理并发性的情况下,除了用户#1之外的其他用户将得到一个异常

我知道我们可以使用SQL事务和隔离级别,如
Serializable
,以确保没有更多的用户同时使用同一段数据,但在这里,我有几个问题:

  • 这是这种情况下的最佳做法吗?如果没有,请分享您的建议
  • 如果是这样,那么其他用户呢?在用户#1获得借书后,他们应该得到什么?另外,在最终确认之后还是之前,在最终级别处理并发是好的
    这种情况下的最佳实践是乐观并发。向表中添加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
    
    创建表dbo.Book(
    Id int NOT NULL约束主键
    ,Title varchar(30)不为空
    ,价格小数(9,2)不为空
    ,状态位不为空
    ,row_version rowversion不为空
    );
    插入dbo.Book(Id、标题、价格、[状态])
    数值(1,'C#6',40.0,0);
    去
    创建PROC dbo.UpdateBookAvailability
    @Id int
    ,@Rowversion Rowversion
    ,@状态位
    像
    更新dbo.Book
    设置状态=@Status
    哪里
    Id=@Id
    和row_version=@RowVersion;
    如果@@ROWCOUNT<1
    开始
    RAISERROR('书本不可用',16,1);
    终止
    去