因为现在在外面突然间想到的问题,请大家分析一下
如我有两个表
一个是VIP卡表如有
VIPNO  Amount
001    1000一个是Invoice发票表(也就是消费记录)
ID  VIPNO  Amount Date我原先的代码为C#

建立链接 oo
启动事务
try
{
    Decimal payAmount = 1000;
    VIPNOInfo  info = new VIPNOInfo(oo,"001") 取出001记录的对像
     if(info.Amount < payAmount)
    {
        throw new Exception("VIP金额不够");
     }
    info.Amount = info.Amount - payAmount;
    VIP.Update(oo,info); 更新VIP减去收费
     //添加发票记录
    InvoiceInfo infoInvoice = new InvoiceInfo();
    infoInvoice.VIPNO = info.VIPNO;
    infoInvoice.Amount =  payAmount;
    infoInvoice.Date = DateTime.Now;
    Invoice.Insert(oo,infoInvoice);
}
catch(Exception ex)
{
    回滚事务
     Tools.Alert(ex.Message);//报错提示
}
finaly
{
   结束事务
   结束链接
   清空资源


开始我以为上面的代码是不会有错的,但现在在客户这里就出错了VIP卡收费超额的问题
我想应该是一个VIP卡在同一时间进行收费的问题
如两个收费地方,同时对一个VIP卡001进行收费
1点击收费时,
if(info.Amount < payAmount)
通过,但事务还没有提交的时候
2点击收费
if(info.Amount < payAmount)
也通过的时候
就会造成收费超额的问题然后我想给VIP添加Updlock但好像也是不行,
因为好像也会和上面的问题一样
最后想添加tablock但这样的话效率太差了大家有什么好的操作流程谢谢

解决方案 »

  1.   

    也就是说
    VIPNOInfo  info = new VIPNOInfo(oo,"001") 取出001记录的对像 
    这一句原来的
    Select * From VIP WHERE VIPNO='001'
    要改为
    Select * From VIP with(rowlock) WHERE VIPNO = '001'
    ???
      

  2.   

    1 如何锁一个表的某一行A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK) 
    注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 
    其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX) 
    其他事务不能读取表,更新和删除
      

  3.   

    也就是我这里的情况是要进行 rowlock而不是updlock??
    谢谢
      

  4.   

    也就是我这里的情况是要进行 rowlock而不是updlock??
    谢谢
      

  5.   

    如果只是针对某个帐户(VIP),行锁即可.