因为现在在外面突然间想到的问题,请大家分析一下
如我有两个表
一个是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但这样的话效率太差了大家有什么好的操作流程谢谢
如我有两个表
一个是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但这样的话效率太差了大家有什么好的操作流程谢谢
VIPNOInfo info = new VIPNOInfo(oo,"001") 取出001记录的对像
这一句原来的
Select * From VIP WHERE VIPNO='001'
要改为
Select * From VIP with(rowlock) WHERE VIPNO = '001'
???
注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
谢谢
谢谢