.net的事务隔离级别为ReadCommitted,当事务中的某语句更新了某个表中的某一条数据数据...这个时候其它进程要select这个表需要等待第一个
事务的结束,有没有什么办法.第一个事务只锁住表中更新的那条数据..而其它没有更新的数据不锁定。就是第二个事务不用等待第一个事务结束。
就可以搜索出该表的其它行的数据??
就是想如果另一个进程是查询的时候涉及到更新的那条数据就等待。。。如果不涉及到那条数据的话就不等待。。就是只锁住那行。。表中的其它行不锁。。怎么实现??
如果是能容忍脏读在TableName后面加 WITH NOLOCK.
如果跳过被锁定行:WITH READPAST
如果要读最后一次提交的数据同时避开锁:Read_Commited_Snapshot = NO,尽在2008以后版本有效
就是想如果另一个进程是查询的时候涉及到更新的那条数据就等待。。。如果不涉及到那条数据的话就不等待。。就是只锁住那行。。表中的其它行不锁。。怎么实现??
@彬彬@科比:
你说的情况是不允许的,在你读的过程中别人可能update你读过的行或者未读的行,你是不是还要回头在读一次? 结果就是要么我读的时候别人不能更新(共享锁默认),要么放弃锁只管往前读(Nolock)。
SQLServer默认的事务隔离机制就是Read Commited,就是你说的这种,有点差别是你等待的时候其实也是持有共享锁的,你的查询完成前,别的连接就不能更新你锁定的行。
根据你查询的数据行数增加,依次升级成:行、页、表锁。如果你强制使用行锁大部分时候效率反而更低,每个锁的开销也是蛮大的。同样你查询完成前所有行锁也不会释放。
如果不是银行,交易等模块的话可以加上NOLOCK放弃概率很小的不一致换来性能的提升。
或者可以考虑行版本处理,读取最后一个已提交的值。
什么都是有代价的,根据需要权衡下。
好难
支持下。
你查查锁级别
查不查不用你说。。我日。会就说。不会滚蛋。。