代码:
SET TRANSACTION ISOLATION LEVEL repeatable read
BEGIN TRAN  select   * from test_tb WITH(READPAST,ROWLOCK,UPDLOCK) where id=1..................
这里取出记录过后。
要进行界面操作。
COMMIT TRAN
update test_tb set uname='oooo' where id=1==============================================================================
当读取数据过后,在界面操作的同时。另一台电脑电脑执行SQL语句。
update test_tb set uname='xxx' where id=3
出现,超时的提示。(也就是不能DELETE,UPDATE,INSERT)
而SELECT则没问题。可能是把整个表给锁定了。================================我现在要做的就是取出一条记录,并锁定这条记录。
一直到界面操作完毕过后。但是操作界面期间,另外的电脑会出现不能DELETE,UPDATE,INSERT的情况。

解决方案 »

  1.   

    http://blog.csdn.net/fredrickhu/archive/2009/09/21/4574867.aspx看看这个
      

  2.   

    可以试试在ID列建立索引,加锁时即可以行锁控制,SET TRANSACTION ISOLATION LEVEL repeatable read
    BEGIN TRAN 
    select * from test_tb WITH(ROWLOCK) where id=1
    update test_tb WITH(ROWLOCK,HOLDLOCK) set uname='oooo' where id=1COMMIT TRAN而且也应该写一个事务里面比较好
      

  3.   

    呵呵,TONY哥,我不是很懂,就看了石头大哥的博客和联机丛书,以后技术内幕还得看一下,研究一下
      

  4.   

    TO:SQL77我的UPDATE要进行界面操作过后才运行。如果放到里面。那么我执行了SELECT后,马上就UPDATE。那我界面修改的数据到哪里UPDATE啊?
      

  5.   

    呵呵得向TONY哥学习呀,我现在功力还太浅了
      

  6.   

    哎哟弄了白天还是没明白。
    我尽量详细说一下我的环境和操作。表:test_TB
    ++++++++++++++++++++++++
    ID     uName sFlag
    1      user1  0
    2      user2  0
    3      user3  0
    .....
    ++++++++++++++++++++++++++
    ===================================
    要实现的功能是这样的。
    我的程序连接到MSSQL数据库test_tb这个表。
    当我读出第一条记录的时候,锁定不能让任何程序操作这一条记录。
    (包括,SELECT,UPDATE,INSERT,DELETE)
    除了第一条记录,任何程序都可以操作包括SELECT ,UPDATE,INSERT,DELETE
    操作完第一条记录后,我会把第一条标实为已操作。=========================================我的代码如下:
    1:已经在ID上面建了一个索引。
    2:读取这个表的SQL:
      SET TRANSACTION ISOLATION LEVEL repeatable read
      BEGIN TRAN  select   * from test_tb WITH(ROWLOCK) where id=1
    3:在界面上输入一个uName的值。然后按下BUTTON。进入更改事件。
      SQL如下:
      COMMIT TRAN
      update test_tb set uName='EDIT的值' where id=1在第2步和第3步的时候,任何程序都是读不到id=1的记录。这个我喜欢。就是要这效果。
    因为怕它们读到就会显示给用户操作。用户就会输入。不管你提交成不成果。用户是会劳动的。
    所以我没有在SELECT完了就COMMIT TRAN
    问题现在出在这里:
      在第2步和第3步,还有一个第三方软件会UPDATE这个表的其它数据。
      可是一UPDATE就会出错。提示超时。
      如果把COMMIT TRAN放在SELECT完了后,就不会出现这样的问题。我应该怎么样解决这个问题呢???向SQL77大哥请教了。能给出具体的代码吗??
    我对这块真的不了解。都弄了一天了!!!
      

  7.   

    update test_tb WITH(ROWLOCK,HOLDLOCK) set uname='oooo' where id=1你UPDATE的时候也加锁试试
      

  8.   

    支持,放在一个事务内,sql77 的代码是t_sql,
    楼主的编程语言应该有事务啊,把sql77的t_sql代码改成楼主的编程语言啊。
      

  9.   

    可以改成
    update test_tb set uName='EDIT的值' where id=1
    COMMIT TRAN
    吗 ?
      

  10.   

    这里我感谢SQL77。已经PASS了。我来总结一下:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    BEGIN TRAN 
    select .........
    这里是界面操作。
    点BUTTON开始的事件代码:COMMIT TRAN
    BeginTRAN
    UPdate....
    COMMIT TRAN
    ----------------------------
    我代码功能就是这样实现的,ID要建索引。还有个第三方程序也要访问数据库。是DONET的DLL库。
    修改他其中的UPDATE,INSERT,DELETE。
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    BeginTRAN
    update[insert,delete]......
    COMMIT TRAN=========================
    目前一切正常。。再次感谢高手。
    先结贴了!!!!受溢不少!