首页 新闻 搜索 专区 学院

c# sql高手进来呀.......难题

0
悬赏园豆:5 [已解决问题] 解决于 2013-02-23 15:52

.net的事务隔离级别为ReadCommitted,当事务中的某语句更新了某个表中的某一条数据数据...这个时候其它进程要select这个表需要等待第一个
事务的结束,有没有什么办法.第一个事务只锁住表中更新的那条数据..而其它没有更新的数据不锁定。就是第二个事务不用等待第一个事务结束。
就可以搜索出该表的其它行的数据??

问题补充:

就是想如果另一个进程是查询的时候涉及到更新的那条数据就等待。。。如果不涉及到那条数据的话就不等待。。就是只锁住那行。。表中的其它行不锁。。怎么实现??

彬彬@科比的主页 彬彬@科比 | 初学一级 | 园豆:43
提问于:2013-02-21 11:14
< >
分享
最佳答案
0

如果是能容忍脏读在TableName后面加 WITH NOLOCK.

如果跳过被锁定行:WITH READPAST

如果要读最后一次提交的数据同时避开锁:Read_Commited_Snapshot = NO,尽在2008以后版本有效

收获园豆:5
luofer | 菜鸟二级 |园豆:468 | 2013-02-21 16:42

就是想如果另一个进程是查询的时候涉及到更新的那条数据就等待。。。如果不涉及到那条数据的话就不等待。。就是只锁住那行。。表中的其它行不锁。。怎么实现??

彬彬@科比 | 园豆:43 (初学一级) | 2013-02-22 00:01

@彬彬@科比: 

 

你说的情况是不允许的,在你读的过程中别人可能update你读过的行或者未读的行,你是不是还要回头在读一次? 结果就是要么我读的时候别人不能更新(共享锁默认),要么放弃锁只管往前读(Nolock)。

 

SQLServer默认的事务隔离机制就是Read Commited,就是你说的这种,有点差别是你等待的时候其实也是持有共享锁的,你的查询完成前,别的连接就不能更新你锁定的行。

根据你查询的数据行数增加,依次升级成:行、页、表锁。如果你强制使用行锁大部分时候效率反而更低,每个锁的开销也是蛮大的。同样你查询完成前所有行锁也不会释放。

如果不是银行,交易等模块的话可以加上NOLOCK放弃概率很小的不一致换来性能的提升。

或者可以考虑行版本处理,读取最后一个已提交的值。

什么都是有代价的,根据需要权衡下。

luofer | 园豆:468 (菜鸟二级) | 2013-02-22 10:20
其他回答(3)
0

好难

jerry-Tom | 园豆:4077 (老鸟四级) | 2013-02-21 11:54
0

支持下。

刀鋒偏冷 | 园豆:202 (菜鸟二级) | 2013-02-21 13:09
0

你查查锁级别

jingjunfeng | 园豆:873 (小虾三级) | 2013-02-21 17:48

查不查不用你说。。我日。会就说。不会滚蛋。。

支持(0) 反对(0) 彬彬@科比 | 园豆:43 (初学一级) | 2013-02-21 23:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册