roy有篇文章:http://blog.csdn.net/roy_88/archive/2008/07/21/2682044.aspx有些不清楚的,请教一下大家:
阻塞2(索引):   
  
-----------------------连接窗口1   
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE    --针对会话设置了 TRANSACTION ISOLATION LEVEL   
begin tran   
    update ta set col2='BB' where COl1=102   
  
--rollback tran   
  
  
  
------------------------连接窗口2   
insert into ta(ID,Col1,Col2) values(5,105,'E')   
  
  
  
处理方法:   
  
create index IX_Ta_Col1 on Ta(Col1)--用COl1列上创索引,当更新时条件:COl1=102会用到索引IX_Ta_Col1上得到一个排它键的范围锁   
  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/roy_88/archive/2008/07/21/2682044.aspx
=================
这个处理方式,如果用到了udpate就在目标表中增加where条件中涉及到的字段索引。如果说,有以下情况呢:
1、udpate t1 set f1 = 'aaa' where id1 = 3 and id2 = 5
这个索引是否是在t1表中
create index IX_T1_1 on T1(id1, id2)创建一个呢?但是如果后面又用到了这个表:
udpate t1 set f2 = 'bbb' where id = 1,怎么办呢?
再建一个索引
create index IX_T1_2 on T1(id) 吗?
 
2、如果update的时候,是这种情况:
udpate t1 set f1 = t2.f2 from t1, t2 where t1.id1 = t2.id1 and t2.id2 = 1
索引也只t1上的就行了吗?
 
3、如果用delete的话,应该是和update一样的处理吧?insert的时候就无所谓了?
 
如果更新的时候有相关索引,就是行锁,没有的话就是表锁,不知道这样理解是否正确?如果是在串行化事务中呢?
 
==------------
另外还有一处,再请教一下:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --设置会话未提交读:指定语句可以读取已由其他事务修改但尚未提交的行 
 
这个我可以在其他单纯的查询过程中指定的吧?如果用了这个,就可以在select语句中不用with(nolock)了,而达到相同的效果?如果查询过程中先设置了READ UNCOMMITTED ,过程完后,还是否需要手工设置回默认(READ COMMITTED)呢?

解决方案 »

  1.   

    锁会根据优化器锁住不同的东西的。delete / insert 都需要维护索引。同一set tran的影响范围在同一会话中。
      

  2.   

    Re:这个我可以在其他单纯的查询过程中指定的吧?如果用了这个,就可以在select语句中不用with(nolock)了,而达到相同的效果?如果查询过程中先设置了READ UNCOMMITTED ,

    是的,当你用了READ UNCOMMITTED则对所有SELECT 语句都不用with(nolock)
    Re :
    过程完后,还是否需要手工设置回默认(READ COMMITTED)呢?
    一般是要的,除非你的程序都允许脏读