【发布时间】:2017-07-05 15:17:59
【问题描述】:
这个问题是相关的/来自对另一件事的讨论: What is the correct isolation level for Order header - Order lines transactions?
想象一下我们有通常的 Orders_Headers 和 Orders_LineItems 表的场景。还可以说,我们有一个特殊的业务规则说:
每个订单都有折扣字段,该字段是根据最后输入的订单所经过的时间计算的
如果过去 Y 小时内有超过 X 个订单,则会专门计算每个下一个订单折扣字段。
如果最近 10 个订单的平均频率高于每分钟 x 次,则专门计算每个下一个订单的折扣字段。
每个下一个订单的折扣字段都是专门计算的
这里的重点是表明每个订单都依赖于以前的订单,并且隔离级别至关重要。
我们有一个事务(只是显示的代码的逻辑):
BEGIN TRANSACTION
INSERT INTO Order_Headers...
SET @Id = SCOPE_IDENTITY()
INSERT INTO Order_LineItems...(using @Id)
DECLARE @SomeVar INT
--just example to show selecting previous x orders
--needed to calculate Discount value for new Order
SELECT @SomeVar = COUNT(*) Order_Headers
WHERE ArbitraryCriteria
UPDATE Order_Headers
SET Discount= UDF(@SomeVar)
WHERE Id = @Id
COMMIT
END TRANSACTION
我们还有另一个事务来读取订单:
SELECT TOP 10 * FROM Order_Headers
ORDER BY Id DESC
问题
第一个事务的 SNAPSHOT 隔离级别和第二个适当级别的 READ COMMITED 隔离级别吗?
是否有更好的方法来处理 CREATE/UPDATE 事务,或者是否可以这样做?
【问题讨论】:
-
不要试图粗鲁...您的数据库是否设置为允许快照隔离?你知道这是什么吗?我不确定您对此了解多少,或者您是否刚刚在谷歌搜索答案时看到了该关键字。
-
不粗鲁;)。是的,它已设置为允许快照隔离。我知道它是什么。不是专家,但我知道它背后的基本思想。这正是我问正确执行此操作的方法的原因,因为我从理论上理解每个隔离级别的含义,但没有像这样的示例的实际经验,也不知道不同方法的所有警告。希望这是有道理的?如果没有,请指出没有意义的地方,以便我澄清更多。
-
在阅读了您上一个问题的 cmets 后,我建议您在该帖子中回复 @DanGuzman 并附上此问题的链接,让他有机会扩展他的 cmets。
-
感谢您的建议。另外,如果您对此问题有想法/解决方案,我很想听听。
标签: sql sql-server transaction-isolation