使一系列SQL语句成为原子

时间:2011-07-19 17:58:45

标签: sql tsql atomic

我需要在sproc原子中进行以下步骤。这是一个近似简化的例子:

客户表(CustomerId,..,OrderMax)
产品表(ProductId,...)
AvailableProducts视图(ProductId和其他属性)
订单(CustomerId,OrderId)

  1. 从Customers表
  2. 中选择@OrderMax
  3. 从AvailableProducts视图中选择TOP @Ordermax
  4. 根据第2步的结果集更新产品中的某些属性
  5. 将订单插入订单表(基于步骤2的结果集)
  6. 返回/选择已插入的订单
  7. 据我所知,整个事情和UPDLOCK都必须有一个事务。必须保护的是用于更新的Products表和用于插入的Orders表。但是,从这两个表构造的视图中查询行。

    在上表中使这个序列原子化和安全更新并插入的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

需要将所有逻辑包装在Begin Transaction,Commit Transaction中。更新/插入并不真正关心数据是否来自连接,除非它以某种方式创建了无法回滚事务的情况,但它必须变得非常混乱以创建这样的情况。如果3.和4.具有复杂的逻辑,则可能会强制进入游标或.NET(但您可以使用常规查询执行一些相当复杂的逻辑)。