日期:2014-05-17  浏览次数:20770 次

如何在存储过程用事务避免并发
在线并发错误 (环境win2003  asp.net c#)
错误根源代码依次如下:
select 用户余额 from user where id=321
..insert 其他表
update user set 用户余额=用户余额-输入金额
select 用户余额 as 新用户余额 from user where id=321
update 主表 set 钱前面=新用户余额 where..

分析:是并发性造成同一秒2个 用户同时 update user set 用户余额=用户余额-输入金额 
(同一用户多个客户端提交数据)   
并发造成2个数据只有一个更新 (按正常逻辑 应该id=321
 

现在我思考如下解决
准备用把这些sql写在存储过程里 
 存储过程里用事务来避免这个情况 
(高并发 几乎每秒都有大量数据提交给在线服务器的 ) 
 
select 用户余额 from user where id=321
..insert 其他表
update user set 用户余额=用户余额-输入金额
select 用户余额 as 新用户余额 from user where id=321
update 主表 set 钱前面=新用户余额 where..
 
这些代码如果同一用户 的2个winform同时执行 
想想如何第2个客户端已经把用户余额=用户余额-输入金额
但第一个客户端由于种种原因没有及时看到最新的 用户余额 
update user set 用户余额=用户余额-输入金额   ---------其中第 2个用户余额放变量里的
希望参与讨论如何解决这个并发问题 (如何在存储过程 用事务避免并发) 

------解决方案--------------------
方法1,
提高事务隔离等级(set transaction isolation level serializable),
加显示事务(begin tran ... commit tran).

方法2,
加存储过程级的applock,防止并发执行.