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) 
其他事务不能读取表,更新和删除

解决方案 »

  1.   

    楼主的问题,解决起来其实很简单。
    利用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
      

  2.   

    如果想先select后update
    需要把缺省的锁定机制设置为REPEATABLE READ。我本人不太喜欢表级锁定,因为这种做法会大大降低并发性,而且这种应用需求更本不需要表级锁。