在第一个连接中执行以下语句 begin tran select * from table1 holdlock -holdlock人为加锁 where B='b2' waitfor delay '00:00:30' --等待30秒 commit tran在第二个连接中执行以下语句 begin tran select A,C from table1 where B='b2' update table1 set A='aa' where B='b2' commit tran若同时执行上述两个语句,则第二个连接中的select查询可以执行 而update必须等待第一个连接中的共享锁结束后才能执行 即要等待30秒
需要先设定锁的隔离级别。 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ说明如下: 有一个表的数据如下 c1 c2 ----------- ------------------------ 1 2003-01-08 12:00:00.000 2 2003-01-08 12:00:00.000 3 2003-01-08 12:00:00.000在SQL Query Analyzer中开两个窗口(相当于两个连接) 1 窗口A中顺序执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READ begin tran select * from t3 where c1=1 --此时已经锁定了该行2 在窗口B中顺序执行select * from t3 -可以得到结果update t3 set c2='2003-1-8 12:00:00' where c1=1 --将会等待直到A释放行锁3 在窗口A中顺序执行commit tran --释放行锁,B的更新将被提交根据楼主的意思,需求是:行锁,并且在查询时就锁住,而不是更新时,所以选择Reapeatable read是最合适的。顺便说一句,采用表级锁,也可以,但是并发程度太低,所以应只在必要时才使用该选项。BOL的说明: SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE }REPEATABLE READ锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。SERIALIZABLE在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
good explanation . looks more complicated than Oracle
begin tran
select * from table1 holdlock -holdlock人为加锁
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran在第二个连接中执行以下语句
begin tran
select A,C from table1
where B='b2'
update table1
set A='aa'
where B='b2'
commit tran若同时执行上述两个语句,则第二个连接中的select查询可以执行
而update必须等待第一个连接中的共享锁结束后才能执行 即要等待30秒
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ说明如下:
有一个表的数据如下
c1 c2
----------- ------------------------
1 2003-01-08 12:00:00.000
2 2003-01-08 12:00:00.000
3 2003-01-08 12:00:00.000在SQL Query Analyzer中开两个窗口(相当于两个连接)
1 窗口A中顺序执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
select * from t3 where c1=1 --此时已经锁定了该行2 在窗口B中顺序执行select * from t3 -可以得到结果update t3 set c2='2003-1-8 12:00:00' where c1=1 --将会等待直到A释放行锁3 在窗口A中顺序执行commit tran --释放行锁,B的更新将被提交根据楼主的意思,需求是:行锁,并且在查询时就锁住,而不是更新时,所以选择Reapeatable read是最合适的。顺便说一句,采用表级锁,也可以,但是并发程度太低,所以应只在必要时才使用该选项。BOL的说明:
SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}REPEATABLE READ锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。SERIALIZABLE在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。