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

前端之家收集整理的这篇文章主要介绍了sql-server-2008 – 在SQL Server中生成订单号的正确方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题当然适用于更广泛的范围,但现在就是这样.

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

每个订单都是特定于供应商的.基本上,我有一个OrderNumberInfo(VendorID,OrderNumber)表.现在,只要客户下订单,我就需要为特定供应商增加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

现在,我已经阅读了关于选择…使用(updlock rowlock),悲观锁定等等,但是不能将所有这些都放在一个连贯的图片中:

>这些提示如何与sql Server 2008s的快照隔离一起使用?
>他们是否执行行级,页级甚至表级锁?
>这如何容忍多个用户尝试为单个供应商生成数字?
>这里适合哪种隔离级别?
>一般而言 – 做这些事情的方法是什么?

编辑

只是为了让事情更清楚:

>在应用程序的这个特定角落的性能绝对不是问题:订单将相对不频繁地进行,并且将涉及对供应商的Web服务的昂贵调用,因此1秒延迟是相当容忍的
>我们确实需要让每个供应商的订单号都是独立和顺序的

解决方法

您的解决方案将在OrderNumberInfo表上创建潜在的性能瓶颈.

是否有任何特定原因导致订单不能简单地成为标识列,可能在应用程序端以供应商ID为前缀(例如MSFT-232323)?

这种方法的唯一缺点是每个供应商的订单不会是“Add-1-to-next-order-#”模式,但我不知道任何技术或业务考虑为什么会出现这种情况一个问题,虽然它可能使顺序处理稍微复杂一些.

它们仍然是每个供应商增加和唯一的,这是订单ID的唯一真正要求.

当然,它具有非常简单的独立于供应商的逻辑的额外好处,假设您有任何其他逻辑 – 例如应用程序范围的QC /报告.

猜你在找的MsSQL相关文章