1 如何锁一个表的某一行
A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK)
注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK)
注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
利用SQL Server缺省得锁定机制就可以了。通过事务,先+1再select,就可以保证并发性,并且大家拿到的序列号不会重复。
CREATE PROCEDURE dbo.sp_GetSequenceNo
(@SequenceName varchar(255),@SeqNo int output)
AS
BEGIN
BEGIN TRAN
UPDATE dbo.Sequence SET seq_curval=seq_curval+seq_step
WHERE seq_name=@SequenceName
IF @@error!=0
BEGIN
ROLLBACK tran
return 0
END
SELECT @SeqNo=seq_curval FROM dbo.Sequence
WHERE seq_name=@SequenceName
COMMIT TRAN
END
需要把缺省的锁定机制设置为REPEATABLE READ。我本人不太喜欢表级锁定,因为这种做法会大大降低并发性,而且这种应用需求更本不需要表级锁。