对阿,我也很奇怪,真是不知道怎么回事! 另外请问我SELECT ID1 FROM TABLE1 FOR UPDATE了,是不是任何连接对象再来更新TABLE1都不行了。
SELECT ID1 FROM TABLE1 FOR UPDATE应该只是瞬间的事吧,不会对B.asp产生什么影响吧
是不是一直未提交就沒有執行SELECT ID1 FROM TABLE1 FOR UPDATE 這個語句?在事務處理中,樓主最好將解決顯示出來看看,SELECT ID1 FROM TABLE1 FOR UPDATE 這個語句的結果如何?
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文结果集是取出来了。
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分钟)的语句,再观察是否已获得锁。
To ORARichard(没钱的日子......) : 神了,确实像你说的那样,我加了一个循环,就发现获得锁了。但是如果像你说的是由于“Rs1.Open SQLStm,OraConn1,3所在的子程序很快结束,默认也就提交了。”那我应该怎么解决阿?我Rs既没有关闭,而且OraConn1也没有OraConn1.CommitTrans,他怎么就会默认提交了呢?是ASP回收机制的问题么?那该如何是好啊?
To ORARichard(没钱的日子......) : 这两个程序是我做试验用的,真正编程的时候的确不会这么做。但是现在我既没关闭Rs,又没OraConn1.CommitTrans,他怎么就会默认提交了呢?纳闷在这里。
你把oraconn1和rs定义成全局变量试试
可能在两个Session里才起作用,在同一个session不起作用。
To ORARichard(没钱的日子......) : 我现在oraconn1和rs都是public的阿,郁闷阿!
To baojianjun(包子) : 没明白您的意思啊!To p0063665() : 我现在就是两个程序两个连接对象(Session)
另外请问我SELECT ID1 FROM TABLE1 FOR UPDATE了,是不是任何连接对象再来更新TABLE1都不行了。
我在SQLPLUS里一打SELECT ID1 FROM TABLE1 FOR UPDATE(不COMMIT),其他访问数据库TABLE1表的进程(包括程序和第三方工具)就会全部憋死,处于等待状态,直到我在SQLPLUS中COMMIT为止。而且Select的结果也有,ID1的值也都取出来了,这个效果是我需要的。现在问题是,如果我在asp程序中执行SELECT ID1 FROM TABLE1 FOR UPDATE(不COMMIT),就达不到这个效果,虽然我在asp中看这个select文结果集是取出来了。
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分钟)的语句,再观察是否已获得锁。
神了,确实像你说的那样,我加了一个循环,就发现获得锁了。但是如果像你说的是由于“Rs1.Open SQLStm,OraConn1,3所在的子程序很快结束,默认也就提交了。”那我应该怎么解决阿?我Rs既没有关闭,而且OraConn1也没有OraConn1.CommitTrans,他怎么就会默认提交了呢?是ASP回收机制的问题么?那该如何是好啊?
这两个程序是我做试验用的,真正编程的时候的确不会这么做。但是现在我既没关闭Rs,又没OraConn1.CommitTrans,他怎么就会默认提交了呢?纳闷在这里。
我现在oraconn1和rs都是public的阿,郁闷阿!
没明白您的意思啊!To p0063665() :
我现在就是两个程序两个连接对象(Session)
你可以把OraConn1放到session中看看结果。
另外,A.asp 和 B.asp用两个不同的IE打开,不要共用session。
asp中定义全局好像就是public阿。To CupTea(一杯清茶) :
嗯,昨天我也怀疑是OraConn1自动销毁了,也放到Session里了,但是还是一样,极其郁闷阿!!
这在IIS4中还不是这样的,目的可能是为了一些程序员忘了写close语句做的补丁吧。因为在IIS4中如果你忘了写close随着使用的增加,你的资源就被自动消耗完了。而在IIS5中就没有这个问题了,你不关表它只要运行到结尾就自动关上了。结贴,散分!