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

多用户并发的问题
服务端运行着一个asp.net程序(没有使用多线程),多用户同时调用服务端程序操作数据表user。

user表
userID userAge
1 23
2 26

执行如下语句:
udpate user set userAge = userAge + 1 where userID=1

如果2个人同时执行这条语句,修改后的值是可能会是24吗?



------解决方案--------------------
对于SQL Server来说,它肯定是25。

(即使你没有显式启用DBTransaction的话)SQL Server默认会对每一条sql语句自动启用transaction。而sql server的默认的事务隔离级别不低,它可以保证第一个会话读取记录时,第二个会话就不能读取,必须等到第一个会话释放transaction(此时usrAge已经是24了)之后才可能读取那些记录。

如果你使用其它关系数据库(例如Oracle的事务隔离级别就低一些),或者大多数NoSQL数据库(几乎都没有数据库事务处理功能),那么就不能保证,所以其结果完全可能是24。这时候就需要在编程中自己做一些处理。

实际上你想象一下传统上人工是如何处理这种冲突的?!只要是传统上人工方法能够处理,也就一定可以通过程序模拟其业务流程。不是什么都靠(关系)数据库的事务来处理这种情况的。

因为每秒钟成百上千的数据库事务并不适合现代互联网社会,数据库事务方法造成了使用关系数据库编程程序比使用NoSql程序慢了很多倍。所以只有银行等机构还保持这对传统关系数据库的绝对支持。而更多的应用都考虑以业务方式(而不是数据库方式)来处理这类冲突。