Transactions 电子商务项目管理

Transactions 电子商务项目管理,transactions,sql-server-2008-r2,Transactions,Sql Server 2008 R2,我正在创建一个销售门票的应用程序,我有一个可用门票的表格 id | serial | sold ------------------------------- 1 | 000001 | false 2 | 000002 | false 3 | 000003 | true 当用户请求一张票时,应用程序会选择一张票并将其标记为已售出 我的问题是:如何管理此表并防止在知道同时会有数百个请求的情况下将同一票证

我正在创建一个销售门票的应用程序,我有一个可用门票的表格

id       | serial      | sold
-------------------------------
1        | 000001      | false
2        | 000002      | false
3        | 000003      | true
当用户请求一张票时,应用程序会选择一张票并将其标记为已售出

我的问题是:如何管理此表并防止在知道同时会有数百个请求的情况下将同一票证出售给不同的用户

我正在考虑锁定,但是当一个事务的行被锁定时,如果另一个事务请求锁定,它必须等到第一个事务完成并将行更新为已售出,那么第二个事务将返回票据已售出。现在,如果第二个事务发现该行被锁定,我如何将其重定向到另一行

编辑

根据Paul Zahra的评论,我创建了一个存储过程

DECLARE @id varchar(MAX)        
SELECT @id = (
    SELECT top(1) [Id]
    FROM   [dbo].[AvailableItems] WITH (ROWLOCK, UPDLOCK)
    WHERE  ([Sold] = 0) )

UPDATE [dbo].[AvailableItems]
SET [Sold] = 1
WHERE [Id] = @id

SELECT [Id], [Serial], [CreateDate], [AvailableTo]
FROM   [dbo].[AvailableItems]
WHERE  ([Id] = @id)

但我需要确定如果两个交易同时发生,第二个交易会发生什么?它会跳过这一行并移到下一行吗?或者等待第一个事务完成,然后选择同一行?

我将使用一个简单的对象锁定该项,并确保它是私有/静态的。这将允许在类的所有实例之间共享其状态,同时防止从类外部修改对象

有关错误处理和锁定,请参阅

为了支持//日志异常锁,将自动释放CALI语句

代码还没有经过测试,但它应该给您一个良好的开端

public class NextTicketinSequence
{
    private static int _LastTicketNumber;
    private static object _TicketLock;

    public static NextTicketinSequence()
    {
         NextTicketinSequence._LastTicketNumber = 0;
    }

   public static int GetNextTicketNumber()
   {
     int ticketId = 0;

      try
      {
        lock(_TicketLock)
        {
            NextTicketinSequence.LoadLastTicketSold();
            ticketId = NextTicketinSequence._LastTicketNumber + 1;
        }
      }
      Catch(Exception ex)
      {
            //Log exception lock will be released automaticaly
      }

      return ticketId
   }

  public static void LoadLastTicketSold
  {
      //Code to get the last ticket marked as sold
  }
}

当有人买票时,你能生成序列号吗?检查序列号是否尚未售出,并将其标记为未售出。否,因为我必须将表格导出到入口系统OK。为什么不简单地循环表,直到达到max id值,寻找一个seld=false?这有点低效,为什么不“选择*where sell=false”?如果由于竞争条件而失败,则循环?这很好,但会延迟请求,那么锁定如何?您能帮我处理代码吗?请阅读。。。现在,要检测一行是否被锁定,恐怕是非常困难的