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

事务问题,请大家帮忙解释下,分不多
大家好,我有个问题想请教下:
SQL事务:事务修改但尚未提交数据怎么理解?例如下面的例子:
begin tran
 update Table2 set X=X+1000;
 waitfor delay '00:00:15';
 select * from Table2;
commit tran
代码执行到update Table2 set X=X+1000这个地方不是已经对数据库进行修改了吗,难道这个地方修改还没有提交到数据库,提交到底是什么意思?谢谢大家指点下我的困惑

------解决方案--------------------
其实操作最开始还是在缓存里面做,然后才到日志文件里面,再做日志备份、checkpoint(默认一分钟自动执行一次)、lazywriter(不定期自动执行)这些操作时,才会写到数据文件,也就是你锁认为的数据库文件里面去。
一旦commit了,那么日志文件就会标识这部分的操作已经提交,也就是永久性修改。哪怕数据库出故障了,这部分的操作也不会回滚,反而会写入到数据文件中。
------解决方案--------------------
探讨

在帖中再次遇到你-DBA,幸会!
那我可不可以这样理解:在该例中执行update、select时候相当于先只是在对数据库的日志文件做修改,等执行到commit tran时,把数据库日志文件的相关操作复现到数据库文件去吗?

------解决方案--------------------
SQLServer默认隔离级别为:read committed,也就是已提交读,如果启用了快照隔离模式,是可以避免脏读的。我也有点晕了,你还是看看博客吧,暂时我也不敢下什么定论。http://blog.csdn.net/happyflystone/article/details/4604573
------解决方案--------------------
任何数据修改,都是先写日志,再填进数据文件。你的数据尚未提交,意思就是没有填进数据文件