一个事务里面2个query有冲突(200分)

  • 主题发起人 主题发起人 Geminiyc
  • 开始时间 开始时间
G

Geminiyc

Unregistered / Unconfirmed
GUEST, unregistred user!
以下事务里面用到了2个不同的Query,但执行到query2.open时程序死机。<br>如果不要事务(StartTransaction),可以顺利的直接执行;<br>或者在运行query2前关闭query1(query1.close)也可以顺利执行<br>但这样就都不能满足我后续程序的处理了<br>没有搞懂原因<br><br>(数据库是sql server2000,以前同样的代码用oracle都没有问题,怪得很)<br>.<br>dm.localdb.StartTransaction;<br>&nbsp; try<br>&nbsp; &nbsp; with dm.query1 do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; close;<br>&nbsp; &nbsp; &nbsp; sql.Text :='insert into table1 (jgh) values(''1002'')';<br>&nbsp; &nbsp; &nbsp; execsql;<br><br>&nbsp; &nbsp; &nbsp; close;<br>&nbsp; &nbsp; &nbsp; sql.text:='select * from table2';<br>&nbsp; &nbsp; &nbsp; open;<br>&nbsp; &nbsp; &nbsp; //close; &nbsp; //添加后正常<br><br>&nbsp; &nbsp; &nbsp; while not eof do<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; dm.Query2.close;<br>&nbsp; &nbsp; &nbsp; &nbsp; dm.Query2.sql.text:='select * from table1' &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; dm.Query2.Open; &nbsp; //执行到此,程序死机<br><br>&nbsp; &nbsp; &nbsp; &nbsp; .......(要用到query1的查询内容)<br><br>&nbsp; &nbsp; &nbsp; &nbsp; next;<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; dm.localdb.commit;<br>&nbsp; &nbsp; end<br>&nbsp; &nbsp; except<br>&nbsp; &nbsp; &nbsp; dm.localdb.Rollback;<br>&nbsp; &nbsp; end;
 
我也沒看出原因,不過我覺得,你可以把Insert和select 分開兩個Query寫,不要用同一個
 
这个方法我试过,就是添加一个query3,但还是不行,一样的死机。<br>始终用一个Query是没有问题的,但这样就不能满足我的需求了,因为后一个查询需要前一个查询的结果
 
同一个事务里,肯定是可以更新,查询的,你用事件探测器看看,同时你的有没有写触发器呀
 
仔细看了下,感觉貌似这有问题<br>&nbsp; &nbsp; &nbsp; while not eof do<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; dm.Query2.close;<br>&nbsp; &nbsp; &nbsp; &nbsp; dm.Query2.sql.text:='select * from table1' &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; dm.Query2.Open; &nbsp; //执行到此,程序死机<br><br>&nbsp; &nbsp; &nbsp; &nbsp; .......(要用到query1的查询内容)<br><br>&nbsp; &nbsp; &nbsp; &nbsp; next;<br>&nbsp; &nbsp; &nbsp; end;<br><br>//前面应该加上<br>First;<br>with not Eof do<br>begin<br>&nbsp; .....<br>&nbsp; //你没有写下面的代码,对于下面你说要用到query1的内容,如果用到的话就会产生query1内的记录指针的移动,这样会造成死循环的喔。。。如果非要用到query1中的内容的话,建议加个bookmark。<br>&nbsp; next;<br>end;<br>再有,如果不是我所说的问题,还是跟一下SQL语句看看吧。。。
 
当然错误了,逻辑上<br>居然你在事务没有提交,你就在检查 while not eof 了??? 
 
谢谢各位,但好像还没有找到问题的关键。<br>to ycluo: sql探测器我用了,没发现异常。<br><br>to lngdtommy : 和死循环无关系,最后一个query2的查询可以把<br>while not eof do<br>去掉,但效果一样——死机。<br><br>后来我把程序改了一下,改为下面的状态——<br>&nbsp; &nbsp; dm.localdb.StartTransaction;<br>&nbsp; &nbsp; try<br>&nbsp; &nbsp; &nbsp; dm.Query1.close;<br>&nbsp; &nbsp; &nbsp; dm.Query1.sql.text:='select * from table2';<br>&nbsp; &nbsp; &nbsp; dm.Query1.open; <br><br>&nbsp; &nbsp; &nbsp; dm.Query2.close;<br>&nbsp; &nbsp; &nbsp; dm.Query2.sql.Text :='insert into table1 (jgh) values(''1002'')';<br>&nbsp; &nbsp; &nbsp; dm.Query2.execsql; &nbsp; &nbsp; //每次F9后,首次运行到此异常,其后正常<br><br>&nbsp; &nbsp; &nbsp; dm.Query3.close;<br>&nbsp; &nbsp; &nbsp; dm.Query3.sql.text:='select * from table1' &nbsp;<br>&nbsp; &nbsp; &nbsp; dm.Query3.Open; &nbsp; <br>&nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; dm.localdb.commit;<br>&nbsp; &nbsp; except<br>&nbsp; &nbsp; &nbsp; dm.localdb.Rollback;<br>&nbsp; &nbsp; end;<br><br>但在 dm.Query2.execsql语句处, &nbsp; &nbsp; //每次F9后,首次运行到此异常,其后正常<br>异常提示如下:<br>Project rs.exe raised exception class EDBEngineError with <br>message 'key viloation,General SQL error.<br>[MicroSoft][ODBC SQL Driver]连接占线导致另一个hstmt'<br>Process stopped.Use Step or Run to continue.<br><br>我查了以前的问题,好像说“hstmt”是“程序某个地方锁住了表或者长时间频繁读取数据,导致其他模块程序无法连接数据库”,但我不清楚该怎么修改和调整。<br><br>谢谢。
 
补充一下:<br>但在 dm.Query2.execsql语句处, &nbsp; &nbsp; //每次F9后,首次运行到此异常,其后正常<br>这句话的意思是,<br>我每次调试时,第一次运行到这里会报异常,但以后连续运行这段程序又正常了。
 
两个query都是同一个connection吗?我曾经碰到过一个问题,用两个dateset操作数据,也是用事务,结果表锁住了,后来都连接一个conection就可以了
 
你的sql没有清除吧<br>你在close前面加条语句<br>&nbsp; &nbsp;sql.clear;<br>你试试
 
采用jiangxidna的方法我基本上把问题解决了,但还必须调整3个query的顺序,即<br>先query2.execsql<br>再query1.open<br>最后query3.open<br>否则,如果采用1-2-3的顺序,则问题依旧。<br><br>to jacket84:我的三个query链接的是同一个database对象<br><br>虽然问题解决了,但原因还是没有搞懂,我准备把delphi7重新安装一次,看看是否delphi错了。
 
路过,路过..
 
重新安装了delphi,虽然有一些变化,但基本和先前一样。<br>算了,不求甚解,屈服了。
 
多人接受答案了。
 
还有问题,没有解决!<br><br>现在只是把3个query的情况勉强解决了,但后面我又遇到4个的情况,又没有办法解决了。<br>实际上,只要是两个不同的query交叉使用就会出现问题,不应该这样的。<br><br>help
 
应该是表锁定的问题,可以用事件探查器看一下,锁在那个sql执行过程中,然后再找sql中的锁信息。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
540
import
I
后退
顶部