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 锁,也是别的会话在当前会话查询的同时,也可以查询同一条记录,只是查询,不能修改,因为修改记录,要得到行的独占锁,也不能删除你的查询结果中的记录,可以插入新记录。