日期:2014-05-18  浏览次数:20777 次

关于sql server中事务的一点小问题
如果 有两个有用户各自启动了事务A和事务B,:A事务执行一条语句,从C表查询数据,B事务也执行一条语句,向C表插入数据 。
A事务先启动,在A事务还没有执行完成时B事务启动了,并且B事务先于A事务完成结束 。那么,当A事务完成 结束时,启动A事务的用户所看到的员工信息是B事务完成前的数据,还是B事务完成后的数据?

------解决方案--------------------
探讨
如果 有两个有用户各自启动了事务A和事务B,:A事务执行一条语句,从C表查询数据,B事务也执行一条语句,向C表插入数据 。
A事务先启动,在A事务还没有执行完成时B事务启动了,并且B事务先于A事务完成结束 。那么,当A事务完成 结束时,启动A事务的用户所看到的员工信息是B事务完成前的数据,还是B事务完成后的数据?

------解决方案--------------------
事务用于保证数据的完整性
如果读出整个表,读出的过程中B事务正在更新或插入记录,此时表会加锁,在B事务提交之前,A事务的数据不可能被取出.最后读出的结果是B事务更新后的数据.
但一般情况下,是A事务数据已读出,但未提交,此时B事务更新数据,不可能影响已读出的数据.
A事务要保证读出的数据不未提交之前不被修改,就要用到可重复读的数据隔离级别或锁,如要保证表数据不被插入,应用最高事务隔离级别或排它锁.设为排它锁之后,A事务未提交,B事务应不可能插入数据.如A事务一直不提交,就会造成B事务死锁.