Sql server 在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
+----+-------+-------+--------+
| Id | Title | Price | Status |
+----+-------+-------+--------+
| 1 | C#6 | 40.00 | 0 |
+----+-------+-------+--------+
状态
列指示可借阅图书的可用性(0=可用,1=已借阅)
假设有两个或多个用户在我的web应用程序中看到了这本书,并且这些用户同时试图借阅这本书,在不管理并发性的情况下,除了用户#1之外的其他用户将得到一个异常
我知道我们可以使用SQL事务和隔离级别,如Serializable
,以确保没有更多的用户同时使用同一段数据,但在这里,我有几个问题:
这种情况下的最佳实践是乐观并发。向表中添加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);
终止
去