有数据表A,用户X在SELECT ,UPDATE等 A的记录之前,设置对A的独占方式打开,此时任何其他用户在对这张表访问之前会先询问是否已经被独占打开,若独占打开则不能作任何操作,X操作结束之后取消独占,其他用户才可以访问此表1。设置独占打开一张表
2。获取表的状态请问各位高手,SQL 里面是否有这样的语句?

解决方案 »

  1.   

    不如设置一个表,来 储存 个表的状态 。。SQL 内部函数,等待高人回答
      

  2.   

    select * from tb (with TABLOCKX)
      

  3.   

    不好意思,打错了
    select * from tb with (TABLOCKX)
      

  4.   


    with (xlock tablock) --定义锁级别+锁范围要判断表状态 sp_lock再过滤objectid可以得到一行或多行rid/pag/tab/db级的数据 这个recordset你拿到也不好操作
      

  5.   

    with (TABLOCKX) 这种办法不行吗/?
      

  6.   

    我的意思是当第一个用户对表作了独占的标记以后,他要作一系列的动作,select,delete ,update都有,都完成了才把标记改回去,在此期间,其他任何用户都不能对该表做任何操作SQL支持这样的独占么
      

  7.   

    这些要在事务中进行
    可以在事务开头加上UPDATE TABLE SET ID=ID来对表加锁。
      

  8.   

    我的意思是当第一个用户对表作了独占的标记以后,他要作一系列的动作,select,delete ,update都有,都完成了才把标记改回去,在此期间,其他任何用户都不能对该表做任何操作 SQL支持这样的独占么--SELECT au_lname FROM authors WITH (NOLOCK)锁定提示                                 描述  
    HOLDLOCK        将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK        等同于        SERIALIZABLE。        
    NOLOCK        不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于        SELECT        语句。        
    PAGLOCK        在通常使用单个表锁的地方采用页锁。        
    READCOMMITTED        用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL        Server        2000        在此隔离级别上操作。        
    READPAST        跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。READPAST        锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于        SELECT        语句。        
    READUNCOMMITTED        等同于        NOLOCK。        
    REPEATABLEREAD        用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。        
    ROWLOCK        使用行级锁,而不使用粒度更粗的页级锁和表级锁。        
    SERIALIZABLE        用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于        HOLDLOCK。        
    TABLOCK        使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL        Server        一直持有该锁。但是,如果同时指定        HOLDLOCK,那么在事务结束之前,锁将被一直持有。        
    TABLOCKX        使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。        
    UPDLOCK        读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK        的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。        
    XLOCK        使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用        PAGLOCK        或        TABLOCK        指定该锁,这种情况下排它锁适用于适当级别的粒度
      

  9.   

    刚才试了,可以的只是有2个问题1〉〉怎么关联Table的ID?SELECT object_name(ID?)52 6 0 0 DB                  S GRANT
    52 1 85575343 0 TAB                  IS GRANT
    52 1 85575343 2 KEY (a802b526c101)   RangeS-S GRANT
    52 6 661577395 0 TAB                  X GRANT
    52 1 85575343 2 KEY (760094527148)   RangeS-S GRANT
    52 1 85575343 2 KEY (7f00d0d5506b)   RangeS-S GRANT
    52 1 85575343 2 KEY (c300d27116cf)   RangeS-S GRANT
    52 1 85575343 2 KEY (0701fdd03550)   RangeS-S GRANT
    52 1 85575343 2 KEY (54013f7c6be5)   RangeS-S GRANT
    52 1 85575343 2 KEY (bc0096b55f46)   RangeS-S GRANT
    52 1 85575343 2 PAG 1:1482           IS GRANT
    52 1 85575343 2 KEY (b200dbb63a8d)   RangeS-S GRANT
    52 1 85575343 2 KEY (49014dc93755)   RangeS-S GRANT
    52 1 85575343 2 KEY (2802f6d3696b)   RangeS-S GRANT
    52 1 85575343 2 KEY (170130366f3d)   RangeS-S GRANT
    52 1 85575343 2 KEY (0701d0ff1b6e)   RangeS-S GRANT
    52 1 85575343 2 KEY (ca008636d9c0)   RangeS-S GRANT
    52 1 85575343 2 KEY (1101ed75c8f8)   RangeS-S GRANT
    54 6 0 0 DB                  S GRANT
    2〉〉
    这个事物,跟C# Ado的Transaction是否会冲突?
    用了SQL的事物,是不是里面不能嵌套ADO的事物了?
      

  10.   

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTIONselect * from tb_user with (TABLOCKX)
     还有个小问题,在锁定期间,好像不用每一句话都要加上WITH (TABLOCKX)吧?只要第一句话有了就可以?
    是否有别的方式来开启这个标志?类似于USE TABLE WITH LOCK....这样的?
    不用每句话都加,否则这样就要改很多代码了
      

  11.   

    开始 一个事务,用一个select 就可以锁定不要时commit一下
      

  12.   

    我希望的是我的函数只有一个参数TableName就可以作锁定了,用SELECT 还要提供一个字段名吧?
     
      

  13.   

    select 1 from tablename with (LOCKTYPE)
      

  14.   

    有没有办法不用SP_LOCK取得锁定表?
    这玩意儿,没法加查询条件,要在程序里面逐条判断,很不爽的
      

  15.   

    insert into ... exec sp_lock 
      

  16.   

    就是update table set pkid=pkid where pkid=@id
    这样也可以起到锁表的作用。
      

  17.   

    BOL中不是有Result Sets嘛 LZ 不是我说 你这个程序做出来了意义也不大 
     
      

  18.   

    Method I
    set transaction isolation level serialiablebegin tran
    select * from tablePinsert/update...commit tran set选项设置对当前连接所有SELECT一直启效 在查询更新插入操作完成之前 表被锁定(Select之后S锁不释放)
      

  19.   

    你用条件判断应该说效果有限 因为你去判断什么级别(TAB、PAG、RID)上的什么锁(S/IS/U/IX/X)呢?判断TAB意义不大(TAB为X的情况很少 大多数IX/S 你判断之后怎么操作?) 判断PAG也是(你怎么得到当前要更新的表范围对应的PAG并和当前锁定的PAG做比较) 如果你判断通过 系统可能还会判断一遍 如果你判断不通过 实际上可能无并发问题 
      

  20.   

    update/insert进行过程中 对应记录S锁不能加 也即是处于pengding的状态
      

  21.   

    维护数据完整行.
    从你的需求来说 
                   1.事务解决不可靠的(事务是行级锁定,对你这根本不使用)
                 2.12楼做标记方法,是可以的(用存储过程实现,一条sql语句实现不了,标记用全局变量@@xxx)
                   -- 并发问题,这里要自己定义一个循环+标记 来阻塞,等上次操作完下面的操作才能开发.
                   3.锁定表也是可行的(存储过程实现,一条sql语句实现不了.lock table unlock table )
    总的来说这个.
                   -- 这个没问题,在mysql(sql server里面我不太清楚)里面锁定表后 并发操作会自动等前面解锁后在操作.