Ado.Net交易锁定

时间:2014-06-13 07:18:48

标签: c# asp.net ado.net locking e-commerce

我正在处理e-commerce应用程序,我在DB中有三个表

  1. 客户
  2. 顺序
  3. 订单明细
  4. Order Details有关单个产品的信息以及OrderIdOrder的主键,我有2 Stored Procedures

    1. InsertIntoOrderAndCustomer
    2. InsertIntoOrderDetails
    3. InsertIntoOrderAndCustomer调用ADO.Net时,它会在autoid中生成OrderId Order,我需要将该ID用作{{1}的参数1}}但我担心如果放置多个订单,那么参数值可能是错误的。我可以锁定InsertIntoOrderDetails代码,以便一次只能下一个订单吗?如果是,那怎么办?

      我很担心

      2人下订单

      执行可能是,

      人A下订单

      1. 将数据插入到人员A的订单表中 - 它将自动生成ID C#(当然只有一次)。
      2. 平均而人B下订单

        1. 将数据插入人员B的订单表中 - 它将自动生成ID IDENTITY(不同的)。
        2. 然后在Orders表中使用AutoId IDENTITY将数据插入product details表。

          插入IDENTITY时,我使用product details的{​​{1}}获取自动ID,这将给我101,如上面的情景。

          第二次插入是否有可能使人B的MAX SQL Server(即101)和人IDENTITY的其他数据?它让我担心。

1 个答案:

答案 0 :(得分:1)

我认为混淆的可能性来自于“我使用{1}}的Sql Server获取自动ID”。 如果您从C#代码调用两个存储过程并独立调用它们,并且第二个sproc(MAX)依赖InsertIntoOrderDetailsMAX获取最后一个自动生成的id,则是的,这需要在OrderDetails表中将用户A或B中的Id混淆。

我可以提出三种方法。可能还有其他人:

  1. 从Orders返回自动生成的id作为Orders的Return或Output参数。 using InsertIntoOrderAndCustomer在调用第二个sproc scope_identity()时将其用作输入参数。 c#代码应该知道哪些客户和订单详细信息在上下文中。

  2. InsertIntoOrderDetails sproc捕获自动生成的ID(使用InsertIntoOrderAndCustomer,然后直接调用scope_identity

  3. 我不推荐这个,但是因为你问过。您的c#代码可以使用InsertIntoOrderDetails来允许一次只调用一次过程代码。这是不可扩展的,如果在c#世界之外调用过程,它也不会禁止使用现有方法进行混合。