窗口1:
begin transaction
insert into t1
update t1
delete from t1窗口2:
select * from t1当窗口1 的事务未commit(或rollback),窗口2的查询就被阻塞,致使系统性能受到很大的影响。
with(unlock)虽然可以查询,但会把脏数据也读过来。
with(readpast)只能把未被update、delete的记录读过来。
如何才能让窗口2 select把窗口1的事务更改前的记录读出来呢?即就是当一个会话更新数据后未提交时,其它会话读取到更新前的结果。还望高手指点,不胜感激!

解决方案 »

  1.   

    因为先执行更新,此时会对该资源增加独占锁.NOLOCK 可能把没有提交事务的数据也显示出来.意思就会读出脏数据.READPAST 会把被锁住的行不显示出来,被锁住的资源是不会出现的.因为目前其状态不明.楼主的需求很古怪,"如何才能让窗口2 select把窗口1的事务更改前的记录读出来呢?" 
    这个会造成用户的疑惑的.
    共享锁: 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。独占锁:用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,SQL Server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。1)排它锁
    新建两个连接
    在第一个连接中执行以下语句
    begin tran
    update table1
    set A='aa'
    where B='b2'
    waitfor delay '00:00:30' --等待30秒
    commit tran
    在第二个连接中执行以下语句
    begin tran
    select * from table1
    where B='b2'
    commit tran若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒来源于:http://www.51testing.com/?uid-258885-action-viewspace-itemid-180776
      

  2.   

    会把事务中未提交的部分也读出来的,如果该事务RollBack了... ...
      

  3.   

    将数据库设置为可提交读快照.ALTER DATABASE db SET READ_COMMITTED_SNAPSHOT ON
      

  4.   

     SET READ_COMMITTED_SNAPSHOT ON
    还是不行啊!
    with(readpast)还是读不到update、delete的记录啊!
      

  5.   

    比如说,我在12:00进行select,想统计一下12:00的账面余额。如果系统更新频繁,总不能把12:01的余额当做12:00的余额吧。
      

  6.   

    with(readpast)当然读不到正在被更新的记录了
      

  7.   

    设置快照读後就不要再加 readpast 提示了