精通,SQL死锁的高手进来在线等! ( 积分: 100 )

  • 主题发起人 主题发起人 jieking
  • 开始时间 开始时间
J

jieking

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在遇到一个问题,有100万条数据表里,两个客户端同时insert和SELECT数据时死锁很严重,我的代码如下:
for i := 0 to aa - 1 do
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SET TRANSACTION ISOLATION LEVEL READ COMMITTED ');
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('insert into table(FD1,FD2,FD3,FD4)values(,1,1,1,4)');
ADOQuery1.ExecSQL;
end;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SET TRANSACTION ISOLATION LEVEL READ COMMITTED ');
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from files WITH (Nolock) where FNo=''' + Edit1.Text + ''' ');
ADOQuery1.open
 
是死锁还是长时间没有响应?
你的插入语句存在效率问题
应该将所有insert语句准备好后一次性执行
如果插入的量很大 还应该先drop索引 插入完成后再重建索引
 
谢谢, ball_cao
现在问题就是死锁,我后来用存储过程测试死锁还是存在,我想请教一下,ADOQUERY1.SQL.ADD(EXEC 过程名称 参数1,2,2,)这样调用和用ADOStoredProc1调用有什么驱别?那种效率高一些?
 
应该是一样的,只不过是不同的控件而已,最终和数据库交流的时候应该是同一个东西。
 
感觉还是效率有问题 没看出有死锁的问题
 
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SET TRANSACTION ISOLATION LEVEL READ COMMITTED ');
ADOQuery1.ExecSQL;
不要用,设在一个事务中就行了,因为你先INSERT加锁了
 
后退
顶部