回答

收藏

事务隔离-插入取决于先前的记录值

技术问答 技术问答 270 人阅读 | 0 人回复 | 2023-09-12

想象一下我们有常规Orders_Headers和Orders_LineItems表的情况。还可以说,我们有一个特殊的业务规则,其中规定:+ G1 U* n' B* |  Y  B. N* r* J
[ol]每个订单都有一个折扣字段,是根据上次输入订单的时间计算的
0 V5 R& F5 l( n; E) g0 q" I如果在过去的Y超过一小时X每个订单的折扣字段将专门计算。4 L( ?0 ]% J1 c: _4 f' T
如果最近10个订单的平均频率高于每分钟x,每个下一个订单折扣字段将专门计算。' A# M" Y9 ^, b7 f, i# t+ ~
每个下一个订单折扣字段都是专门计算的
8 R( v' j; Z; z, o0 ~! z. H7 D+ @[/ol]这里的要点是,每个订单都依赖于以前的订单,隔离级别非常重要。
! J& s! ^. @" k! x( u我们有一个事务(只是代码的逻辑):
( N' H' w4 k$ z$ I9 M; eBEGIN TRANSACTIONINSERT 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 OrderSELECT @SomeVar = COUNT(*) Order_HeadersWHERE ArbitraryCriteriaUPDATE Order_HeadersSET Discount= UDF(@SomeVar)WHERE Id = @IdCOMMITEND TRANSACTION我们还有另一笔交易来读取订单:% s7 }7 f6 K  s: s3 m
SELECT TOP 10 * FROM Order_HeadersORDER BY Id DESC问题
1 D1 |: \- d8 p' w% A. q[ol]SNAPSHOT隔离级是否适用于第一件事,READ COMMITED是否适用于第二个适当级别?
9 P; H) g, k5 G! v; P$ V有没有更好的方法来处理?CREATE / UPDATE事务,还是这样做?
- h: Y6 _) Z3 q% t/ e8 `1 r7 M[/ol]                                                                6 k9 j9 G: F; h! x' f: A7 o2 W5 y
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则