日期:2014-05-16  浏览次数:20589 次

select 语句会对数据加锁吗?
比如:select a.name , b.je , b.id , b.bz , b.lx from tab01kh a , t02iccard b where a.id =b.kh_id and b.iccard ='0000005395' and b.xlh ='7FE31C2' and b.bz < 2 
上面语句查询时,如果此时其它客户向a或b表插入数据或更新数据、查询数据,是否会产生阻塞?
------解决方案--------------------
sql查询的时候会加S锁,查询解锁后,会释放S锁。至于会不会形成阻塞,那要看你的select语句有没有执行完毕,阻塞多长时间要看你sql语句的执行效率
------解决方案--------------------
取决于你的隔离级别,默认是加S锁的。
When you don’t want that readers are acquiring S locks (which isn’t really recommended), you can use the Isolation Level Read Uncommitted.
------解决方案--------------------
读的时候不影响其他用户的写和更新操作
------解决方案--------------------
1)默认情况加锁除非指定nolock 或者时uncommited事务级别
2)是否会对update ,insert造成堵塞 要看相互申请的资源是否是同一种
3)同时要看锁的粒度 比如select update insert都是操作 同一页面 select 在页面上会有S锁 堵塞X锁 ,如果select 持有的是表锁
  更加会堵塞,这些可以依靠索引,事务,等调整锁的粒度 尽量减少堵塞的时间

------解决方案--------------------
看事务的范围和隔离级别。
------解决方案--------------------
减少查询的时间,锁持有的时间理论上就减少了,这样阻塞的机会就少了。另外有索引的话,很多情况下不需要锁住整个表。只需要锁住所需的行
------解决方案--------------------
加了索引一般都有排序,容易进行定位。
      从数据来讲,我觉得加索引提高查询速率,有两个方面:
     1.通过减少I/O,降低db_block访问量,加快数据存取效率从来来加快sql执行效率。
     2.有些索引会对数据进行物理排序等操作,牺牲少量维护空间的代价来有效减少查询时的计算量。
      从结构来看,树形的查询也是比线行的查询效率要高效。
------解决方案--------------------
肯定会产生阻塞,但是加了一个关键字可以不锁表查询

如你的语句,改成下面这样就可以了,就完全不会有阻塞

select a.name , b.je , b.id , b.bz , b.lx from tab01kh a (NOLOCK), t02iccard b (NOLOCK) where a.id =b.kh_id and b.iccard ='0000005395' and b.xlh ='7FE31C2' and b.bz < 2 


注意关键字(NOLOCK)

给分吧,楼主
------解决方案--------------------
加锁是肯定的,select 语句加的是共享锁,也就是大家常说的 S 锁,也是别的会话在当前会话查询的同时,也可以查询同一条记录,只是查询,不能修改,因为修改记录,要得到行的独占锁,也不能删除你的查询结果中的记录,可以插入新记录。