【发布时间】:2017-11-01 16:05:37
【问题描述】:
所以我们有四个陈述(为了问题的目的而改变)
它们在TransactionScope (ReadCommitted) 中运行,多个进程可以同时调用包含这些语句的同一个存储过程:
SELECT @BathroomId = B.BathroomId
FROM Bathrooms B
WHERE B.BathroomSuite = @BathroomSuite AND B.SuiteIsAvailable = 1
(No indexes used at all)
SELECT @OrderReceiptId = O.OrderReceiptId
FROM Order O
WHERE O.OrderId = @OrderId
(Clustered Index)
IF ISNULL(@OrderReceiptId, -1) = -1
BEGIN
INSERT INTO [dbo].[OrderReceipt]
.....
(Clustered index on PK)
UPDATE Order
SET OrderReceiptId = @@SCOPE_IDENTITY
WHERE OrderId = @OrderId
从我有限的阅读中,我了解到只有行锁应该用于 SELECTS(因此,限制了对这些表的争用的影响)
但是,那么,INSERT/UPDATE 将使用什么锁,这对其他与总体事务竞争的进程有什么影响?
在事务完成之前,我们是否有效地控制了这些表?或者只是一些表(即只有 INSERT 和 UPDATE - 因为在我看来,事务实际上只与 INSERT 和 UPDATE 相关(例如,不能回滚 SELECT)
其他竞争进程是否必须等到事务完成(我认为这当然不是不合理的)
数据库锁定和事务关系有些模糊,因为这会影响包含这些语句的存储过程的多个调用者。
注意请忽略 Order 和 OrderReceipt 之间的狡猾关系,这绝对是次优的。
我认为我将事务作为一种锁定机制(有点像用于线程同步的线程锁)和数据库级锁定混为一谈
编辑:是的,我将事务和数据库锁定(一起使用但职责略有不同)混为一谈,任何 google 101 网站都会告诉我这一点。这很尴尬,但它会教会我没有先喝水。
【问题讨论】:
-
您使用的是什么 DBMS?如果是 SQL Server,答案可能取决于您的快照隔离级别...
-
@OlaBerntsson SQL 服务器。
标签: c# sql transactions locking transactionscope