CREATE TABLE Test ( id int identity(1,1) PRIMARY KEY NOT NULL, TestName varchar(100) DEFAULT '' NOT NULL, dt datetime DEFAULT GETDATE() NOT NULL ) GO CREATE PROC SP_TestTran1 @num int out AS /****************** 用于得到test1的总数据,并加锁 *******************/ BEGIN SELECT @num = Count(id) from test WITH(TABLOCKX)--排它锁,加锁后不能读取、更新等操作 --SELECT @num = Count(id) from test --需要看下加锁和不加锁的情况 END GO CREATE PROC SP_TestTran2 AS /************************************************************************ 先获取总数,再延时一段时间,在这一段时间内执行过程SP_TestTran3,看执行结果 *************************************************************************/ BEGIN DECLARE @num int SET @num = 0 BEGIN TRAN EXEC SP_TestTran1 @num output PRINT (@num) Waitfor delay '00:00:10' IF(@num < 1) INSERT INTO test(testname) VALUES('test') IF(@@ERROR = 0) BEGIN COMMIT TRAN END ELSE BEGIN ROLLBACK TRAN END END GO CREATE PROC SP_TestTran3 AS /************************************************************************ 先获取总数,再延时一段时间,在这一段时间内执行过程SP_TestTran3,看执行结果 *************************************************************************/ BEGIN DECLARE @num int SET @num = 0 BEGIN TRAN EXEC SP_TestTran1 @num output PRINT (@num) --Waitfor delay '00:00:10' IF(@num < 1) INSERT INTO test(testname) VALUES('test') IF(@@ERROR = 0) BEGIN COMMIT TRAN END ELSE BEGIN ROLLBACK TRAN END END GO 操作: 先执行SP_TestTran2, 在P_TestTran2延时的这段时间内执行SP_TestTran3 会发现: 1)当SP_TestTran1中不加锁时,执行完SP_TestTran2和SP_TestTran3后会插入两条记录(因为SP_TestTran2和SP_TestTran3查到的都是0) 2)当SP_TestTran1中加锁时,执行完SP_TestTran2和SP_TestTran3后会只插入一条记录(因为加锁的原因,SP_TestTran2事务占用了test表资源,不能查询、更新等操作,等这个事务执行完后,SP_TestTran3才可以操作)