大家好,我有个问题想请教下:
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这个地方不是已经对数据库进行修改了吗,难道这个地方修改还没有提交到数据库,提交到底是什么意思?谢谢大家指点下我的困惑
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这个地方不是已经对数据库进行修改了吗,难道这个地方修改还没有提交到数据库,提交到底是什么意思?谢谢大家指点下我的困惑
你上面的操作会记录到日志文件中,但是在commit之前,这部分的操作会被标志未未提交,一旦数据库突然发生故障,那么这部分未提交的事务是不会生效的,也就是回滚掉,等于没做过。
那我可不可以这样理解:在该例中执行update、select时候相当于先只是在对数据库的日志文件做修改,等执行到commit tran时,把数据库日志文件的相关操作复现到数据库文件去吗?
一旦commit了,那么日志文件就会标识这部分的操作已经提交,也就是永久性修改。哪怕数据库出故障了,这部分的操作也不会回滚,反而会写入到数据文件中。
回到脏读的话题,脏读dirtyreads:当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。
问题:既然脏读是在事务未提交时读取数据,而事务未提交没有修改数据库表文件,那脏读是怎么形成的,难道他不直接读表文件,而是先去读数据库日志文件?谢谢你的回答,可能我问的问题有点弱智,再次谢谢
回到脏读的话题,脏读dirtyreads:当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。
问题:既然脏读是在事务未提交时读取数据,而事务未提交没有修改数据库表文件,那脏读是怎么形成的,难道他不直接读表文件,而是先去读数据库日志文件?