关于sql的阻塞、表锁
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)呢?
------解决方案--------------------一个表中可以有一个聚集索引,多个非聚集索引。
------解决方案--------------------
锁会根据优化器锁住不同的东西的。delete / insert 都需要维护索引。同一set tran。。。的影响范围在同一会话中。
------解决方案--------------------
Re:
这个我可以在其他单纯的查询过程中指定的吧?如果用了这个,就可以在select语句中不用with(nolock)了,而达到相同的效果?如果查询过程中先设置了READ UNCOMMITTED ,
是的,当你用了READ UNCOMMITTED则对所有SELECT 语句都不用with(nolock)
Re :
过程完后,还是否需要手工设置回默认(READ COMMITTED)呢?
一般是要的,除非你的程序都允许脏读