SELECT ID1 FROM TABLE1 FOR UPDATE  应该可以锁住表了

解决方案 »

  1.   

    对阿,我也很奇怪,真是不知道怎么回事!
    另外请问我SELECT ID1 FROM TABLE1 FOR UPDATE了,是不是任何连接对象再来更新TABLE1都不行了。
      

  2.   

    SELECT ID1 FROM TABLE1 FOR UPDATE应该只是瞬间的事吧,不会对B.asp产生什么影响吧
      

  3.   

    是不是一直未提交就沒有執行SELECT ID1 FROM TABLE1 FOR UPDATE 這個語句?在事務處理中,樓主最好將解決顯示出來看看,SELECT ID1 FROM TABLE1 FOR UPDATE 這個語句的結果如何?
      

  4.   

    To ORARichard(没钱的日子......)  and baojianjun(包子):
       我在SQLPLUS里一打SELECT ID1 FROM TABLE1 FOR UPDATE(不COMMIT),其他访问数据库TABLE1表的进程(包括程序和第三方工具)就会全部憋死,处于等待状态,直到我在SQLPLUS中COMMIT为止。而且Select的结果也有,ID1的值也都取出来了,这个效果是我需要的。现在问题是,如果我在asp程序中执行SELECT ID1 FROM TABLE1 FOR UPDATE(不COMMIT),就达不到这个效果,虽然我在asp中看这个select文结果集是取出来了。
      

  5.   

    A.asp部分代码:
    Dim OraConn1
    Set OraConn1 = Server.CreateObject("ADODB.Connection")connstr = "Provider=MSDataShape.1;Persist Security Info=False;Data Provider=MSDAORA;" &_
     "Data Source=xxx;User Id=xxx;Password=xxx;"
    OraConn1.Open connstr   '建立数据库连接OraConn1.BeginTrans   '开始事务
    Set Rs1 = Server.CreateObject("ADODB.Recordset")
    SQLStm = "SELECT ID1 FROM TABLE1 FOR UPDATE "
    Rs1.Open SQLStm,OraConn1,3
    OraConn1一直未提交-------------------------
    其实当你执行Rs1.Open SQLStm,OraConn1,3后,已经获得了table1上的行共享锁。这时其它会话(session)已经无法更新或删除。只是你Rs1.Open SQLStm,OraConn1,3所在的子程序很快结束,默认也就提交了。所以看到的现象是没有获得锁。你试试在Rs1.Open SQLStm,OraConn1这个代码后,再加上一个类似死循环(或长时间执行如3分钟)的语句,再观察是否已获得锁。
      

  6.   

    To ORARichard(没钱的日子......) :
       神了,确实像你说的那样,我加了一个循环,就发现获得锁了。但是如果像你说的是由于“Rs1.Open SQLStm,OraConn1,3所在的子程序很快结束,默认也就提交了。”那我应该怎么解决阿?我Rs既没有关闭,而且OraConn1也没有OraConn1.CommitTrans,他怎么就会默认提交了呢?是ASP回收机制的问题么?那该如何是好啊?
      

  7.   

    To ORARichard(没钱的日子......) :
       这两个程序是我做试验用的,真正编程的时候的确不会这么做。但是现在我既没关闭Rs,又没OraConn1.CommitTrans,他怎么就会默认提交了呢?纳闷在这里。
      

  8.   

    你把oraconn1和rs定义成全局变量试试
      

  9.   

    可能在两个Session里才起作用,在同一个session不起作用。
      

  10.   

    To ORARichard(没钱的日子......) :
       我现在oraconn1和rs都是public的阿,郁闷阿!
      

  11.   

    To baojianjun(包子) :
       没明白您的意思啊!To p0063665() :
       我现在就是两个程序两个连接对象(Session)
      

  12.   

    不是PUBLIC,是全局变量,把变量定义到子程序外面去,肯定可以的
      

  13.   

    A.asp页面生成完成后,OraConn1就自动销毁了。
    你可以把OraConn1放到session中看看结果。
    另外,A.asp 和 B.asp用两个不同的IE打开,不要共用session。
      

  14.   

    To ORARichard(没钱的日子......) :
       asp中定义全局好像就是public阿。To CupTea(一杯清茶)  :
       嗯,昨天我也怀疑是OraConn1自动销毁了,也放到Session里了,但是还是一样,极其郁闷阿!!
      

  15.   

    有人告诉我是IIS5有自动默认提交完成的功能了,也就是说你不关闭表,但接下来你没有操作了,而且已经到达文件的尾部,这个表就自动被关闭了。
    这在IIS4中还不是这样的,目的可能是为了一些程序员忘了写close语句做的补丁吧。因为在IIS4中如果你忘了写close随着使用的增加,你的资源就被自动消耗完了。而在IIS5中就没有这个问题了,你不关表它只要运行到结尾就自动关上了。结贴,散分!