sql-server-2008 - 在 SQL Server 中生成订单号的正确方法

标签 sql-server-2008 concurrency locking

这个问题当然适用于更广泛的范围,但在这里。

我有一个基本的电子商务应用程序,用户可以很自然地在其中下订单。所述订单需要有一个唯一编号,我现在正在尝试生成该编号。

每个订单都是特定于供应商的。基本上,我有一个 OrderNumberInfo (VendorID, OrderNumber) table 。现在,每当客户下订单时,我都需要增加 OrderNumber对于特定的供应商并返回该值。自然,我不希望其他进程干扰我,所以我需要以某种方式专门锁定这一行:

begin tranaction

    declare @n int
    select @n = OrderNumber 
      from OrderNumberInfo 
      where VendorID = @vendorID

    update OrderNumberInfo 
      set OrderNumber = @n + 1 
      where OrderNumber = @n and VendorID = @vendorID

commit transaction

现在,我已经阅读了 select ... with (updlock rowlock) ,悲观锁定等,但不能将所有这些放在一个连贯的图片中:
  • 这些提示如何与 SQL Server 2008s 的快照隔离配合使用?
  • 它们是否执行行级、页级甚至表级锁?
  • 这如何容忍多个用户尝试为单个供应商生成数字?
  • 什么隔离级别在这里合适?
  • 一般来说 - 做这些事情的方法是什么?

  • 编辑

    只是为了让一些事情更清楚:
  • 应用程序这个特定角落的性能绝对不是问题:订单将相对较少下达,并且会涉及对供应商网络服务的昂贵调用,因此 1 秒延迟是可以容忍的
  • 我们真的需要让每个供应商的订单号独立且连续
  • 最佳答案

    您的解决方案将在 OrderNumberInfo 上造成潜在的性能瓶颈。 table 。

    订单不能简单地作为身份列,可能在应用程序端以供应商 ID 为前缀(例如 MSFT-232323)是否有任何具体原因?

    这种方法的唯一缺点是每个供应商的订单不会是“添加 1 到获取下一个订单-#”模式,但我不知道为什么会出现任何技术或业务考虑一个问题,尽管它可能会使按顺序处理的顺序稍微复杂一些。

    它们仍然会增加并且每个供应商都是唯一的,这是订单 ID 的唯一真正要求。

    当然,假设您曾经拥有任何独立于供应商的逻辑,它当然会具有额外的附带好处——例如应用程序范围的 QC/报告。

    关于sql-server-2008 - 在 SQL Server 中生成订单号的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2990883/

    相关文章:

    php - PDO 和 SQL Server 使用 SQL Server Auth 而不是 Windows Auth

    Sql 在每个分类中获取前 2 个结果

    go - 使用 Slices 和 Golang sync.Map 结构

    mysql - 了解 MySQL InnoDB 锁

    Visual Studio 2012 中的 c++11 std::mutex 编译器错误

    SQL Server : flatten results from One to Many query

    c# - 正确使用DBNull

    c - C 中的原子读取

    Golang rest api并发

    c++ - c/c++ Linux 允许的最大互斥量