這個訪問的意思是不允許刪除、修改,但可以查詢的意思,你可以試update語句一下,你看要等待多久?

解决方案 »

  1.   

    连接 A,连接 B同时执行的时候.
    当连接 A 执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READ时候,同时执行了连接 B的select ClientID from cimain where clientid = '001234567811'这个语句,所以 连接 B 立即显示出记录,而
    连接 A 中用了waitfor delay '00:00:30'所以连接A中的记录要延迟30秒显示.
    改正方法:
    把 连接 A 中waitfor delay '00:00:30'移到连接 B 的后面.
      

  2.   

    to  hdhai9451(Water Space--海洋空間) :
        不允許刪除、修改、查詢 即任何操作
    to  slyfox123456() 
        如果把  waitfor delay '00:00:30' 放在  连接 B  中那肯定会是正常的,但这不符合实际的操作啊!!难道每次读一个记录时都要延迟30秒???
        另外,我已经对行时进行加锁了啊!!!!
      

  3.   

    'A立即显示出记录是不行的,因为它是一个批处理过程(不是因为锁或事务的关系),你直接测试下面的语句,它会等待两秒,而不是立即显示出结果
    select * from sysobjects
    waitfor delay '00:00:02'
      

  4.   

    你在cimain  这个表中加上一个字段,来标示他的情况不就行了,比方说用beactive 来表示活动的情况:   beactive ='是'  ----表示此信息正常
       beactive ='否'  ----表示此信息不可用
       beactive ='定'  ----表示此信息锁定用事务控制好回滚,不就行了!我们也是这么做的!
      

  5.   

    to zjcxc(邹建) :
         放开锁或事务,如何实现:当一记录被某一用户访问时,则进行保护起来不充许其它的用户进行访问?to  hglhyy(查無此人) :
         你的说的方法,我有想过,但感觉有点耗资源,如果实在没有好的办法,我就只能接受这样的强奸 :(
      

  6.   

    有过这样一个例子,他说明没办法不让别人select ,除非前面那个人是在做update1)排它锁
    新建两个连接
    在第一个连接中执行以下语句
    begin tran
    update table1
    set A='aa'
    where B='b2'
    waitfor delay '00:00:30' --等待30秒
    commit tran
    在第二个连接中执行以下语句
    begin tran
    select * from table1
    where B='b2' 
    commit tran 若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒
      

  7.   

    --其实楼主无非就是样不发生以前情况
    脏读
    A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读
    A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致 ---
    只要前面那个用户没有修改数据,那么让两个用户同时读有什么问题呢?跟你一起郁闷ing.....
      

  8.   

    to  didoleo:握个手,同感的朋友...
    其实这个问题我在CSDN搜索了几天关于这方面的问题,但没有很好的解决方案。等待有经验的朋友出来!!!
      

  9.   

    你要锁定的话,可以用将行级锁换为粒度粗一点的页级锁SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    begin tran
    select ClientID from cimain (PAGLOCK,XLOCK)  --换为页级锁
       where  clientid ='001234567811'
        waitfor delay '00:00:30'     -- 在30秒内不让其它的终端访问此记录(显示不关锁或事务的事)
    commit transelect ClientID from cimain where clientid = '001234567811'
      

  10.   

    to 邹老师 : 
        谢谢你指教!
        按你的方法可以禁止其它的终端访问在30秒内无法访问同时操作的记录,请问
        为什么要必须要将 ROWLOCK 换成  (PAGLOCK,XLOCK)  ???
        
        另外,我想当某一记录被某一个终端第一次访问时不进行延时,而是直接读取,只是在特别巧合的情况下即同一时刻有其它的终端来访问时就延时30秒,不知道如何解决?难道必须按  hglhyy(查無此人) 的方法才能实现吗?
      

  11.   

    1.
    begin tran
    select * 
    from 表 with(TABLOCKx)
    waitfor delay '00:00:10' --等待10秒
    commit tran2.
    select * 
    from 表