如何在存储过程用事务避免并发
在线并发错误 (环境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,防止并发执行.