MSSQL SERVER 锁的那些事

     由于项目中对一个表 进行了大量的 insert,update 操作,并发特别高,所以打算研究下sql 中锁的一些概念

     我一直都认为 每个sql语句都会是一个单独的事务执行

     比如  

Insert into Table(A,B) values (C,D) WAITFOR DELAY '00:00:50'

  我一直认为它加入的是 X 排它锁, 但是用语句查看下 

EXECUTE sys.sp_lock @spid1 = 51, -- int
    @spid2 = 0 -- int

  

是S锁,但是如果把它放到一个事务中

BEGIN TRAN

INSERT  INTO [BatchWr].[dbo].[Tbl_Test]
        ( [UserName], [TDate], [MsgID] )
VALUES  ( 'havid', GETDATE(), 1001 )
WAITFOR DELAY '00:00:50'

COMMIT TRAN

以下是查询结果

发现加入了X锁 IX锁  

这个时候执行 update/select 都会阻塞,但是通过定义事务隔离级别

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

感觉这个时候 Insert 应该是加入的行锁 ,执行其他操作就可以了。

如果你在平时的 SQL 语句中不使用事务的话,那锁都是通过数据库自己来控制的,悲观锁。。。

但是如果大批量的插入更新,用事务又觉得浪费资源

话说单独的 insert/update 语句,也会导致锁表,搜了下解释是 sql锁会根据资源的大小自动进行升级,页锁,表锁。。。。。。

 

列下搜集的几个关于sql锁的资源

阻塞分析

http://blog.csdn.net/roy_88/article/details/2682044

MSDN 锁兼容性

 

http://msdn.microsoft.com/zh-cn/library/ms186396.aspx

锁分析

http://dapple.iteye.com/blog/730043

    

posted on 2012-10-12 14:36  havid  阅读(218)  评论(0编辑  收藏  举报

导航