由于项目中对一个表 进行了大量的 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 TRANINSERT 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锁的资源
阻塞分析
MSDN 锁兼容性
锁分析