事务问题,BDE对SQL Server的事务缺陷,高手请进,100分奉上(100分)

  • 主题发起人 主题发起人 hsj
  • 开始时间 开始时间
H

hsj

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是非常简单的测试代码。先插入数据,然后打开,然后再修改。
代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Database1.StartTransaction;
  with Query1 do
  begin
    SQL.Text:='insert into c_move_list(case_no,doc_no,city_unit) '
      +' values(100,100,''aaaaaaaaaaaa'')';
    ExecSQL;
  end;
  with Query2 do
  begin
    SQL.Text:='select * from c_move_list';
    Open;
  end;
  with Query3 do
  begin
    SQL.Text:='update c_move_list set city_unit=''kdkdkdkd'' where case_no=100';
    ExecSQL;
  end;
  Database1.Rollback;
end;
如果我连接的数据库是Oracle的话,那么上面的代码没有什么问题,但是我连接的如果是SQL Server的话,那么在Query3执行的时候就会一直停在ExecSQL操作上,——显然Query2的操作锁住了表格c_move_list。
如果在Query2的Open之后,再紧跟Close,问题也没有。再如果把Query换成ADOQuery,Database换成ADOConnection的话也没有这个问题。希望得到高手的指教。

 
SQL Server/Access之类的,都是microsoft的,最好使用ado
况且,bde也是面临淘汰的东西
 
呵呵,hsj同志哥:你光启动事务,不用提交,它当然一直在等待你提交啦。
这样写:
if not Database1.InTransaction then
Database1.StartTransaction;
try
with Query1 do
begin
SQL.Text:='insert into c_move_list(case_no,doc_no,city_unit) '
+' values(100,100,''aaaaaaaaaaaa'')';
ExecSQL;
end;
with Query2 do
begin
SQL.Text:='select * from c_move_list';
Open;
end;
with Query3 do
begin
SQL.Text:='update c_move_list set city_unit=''kdkdkdkd'' where case_no=100';
ExecSQL;
end;
Database1.Commit;
except
Database1.Rollback;
end;
使用ADO 的事务管理也是一样的道理。不过ADO有许多BUG,需要安装补丁。
 
awind616同志哥:
还未等Query3.Execute执行结束,就死在这里了,所以根本没有到Commit这一步。
谢谢诸位,请继续关注!!!
 
select 语句按道理是不会加锁的
除非你把RequestLive设为true
 
把这条语句抽出来试试看!
// with Query2 do
// begin
// SQL.Text:='select * from c_move_list';
// Open;
// end;
 
沉香屑:
我没有设置Query的属性RequestLive,事实上它的确加锁了。
smallbs:
如果把上述语句注释掉,那么可以正常执行了。事实证明Open操作加锁了。

还有什么好办法?
 
with Query2 do
begin
SQL.Text:='select * from c_move_list';
Open;
FetchAll; //加入这句
end;

如果行不通,就不能把Query2的部分放在事务里处理了
 
我觉得这种现象只能这样理解:
在insert操作时,对某行加了一个独占锁
随后对整个表作select操作,需要对整个表加共享锁
由于insert还没有提交
共享锁处于等待状态
然后update再对某行加锁就也需要等待
所以在insert后应该提交事务
因为独占锁可以加在共享锁上
或者用'select * from c_move_list where case_no<>100'
 
可能是金山毒霸的原因,现在我把其它几个软件的卸载了以后,这个现象好了——
这太奇怪了!!
现在开始散分。谢谢大家的帮助,分数不多,尽个意思而已。谢谢
 
多人接受答案了。
 
后退
顶部