Delphi 2010: метод обработки безопасности UniDAC vs Indy-MultiThread

Я занимаюсь разработкой приложений на основе Indy. Сервер имеет несколько компонентов Indy TCP Server. Так что он работает под многопоточностью и обрабатывает MySQL DB. Я столкнулся с одной проблемой. Это касается исключений MySQL DB в потоках. Когда несколько потоков атакуют на одну и ту же таблицу базы данных, то это говорит мне следующее

UniQuery_Mgr: Duplicate field name 'id'
UniQuery_Mgr: Field 'grp_id' not found //of course grp_id field is really existed.
Assertion failure (C:\Program Files (x86)\unidac539src\Source\CRVio.pas, line 255)
Commands out of sync;  You can't run this command now
ReceiveHeader: Net packets out of order: received[0], expected[1]
UniQuery_Mgr: Cannot perform this operation on a closed dataset

Как мне это сделать? UniQuery_Mgr является компонентом TUniQuery. и мой код обработки запросов обычно так

Код 1

  sql := 'SELECT * FROM data_writed;';//for example
  UniQuery_Mgr.SQL.Clear;
  UniQuery_Mgr.SQL.Add(sql);
  UniQuery_Mgr.ExecSQL;

Код 2

  try
    sql := 'SELECT * FROM gamegrp_mgr;';
    UniQuery_Mgr.SQL.Clear;
    UniQuery_Mgr.SQL.Add(sql);
    UniQuery_Mgr.ExecSQL;

    if UniQuery_Mgr.RecordCount > 0 then
    begin
      MAX_GAME_GROUP_COUNT := UniQuery_Mgr.RecordCount + 1;

      UniQuery_Mgr.First;
      i := 1;
      while not UniQuery_Mgr.Eof do
      begin
        Game_Group_ID[i] := UniQuery_Mgr.FieldByName('grp_id').AsInteger;
        Game_Game_ID[i] := UniQuery_Mgr.FieldByName('game_id').AsInteger;
        UniQuery_Mgr.Next;
        Inc(i);
      end;
    end;
  except
    on E : Exception do
    begin
      EGAMEMSG := Format('GAME group read error: <%s> @ %s',[ E.ToString, DateTimeToStr(now)]);
      Exit;
    end;
  end;

Код 3

  try
    sql := 'UPDATE data_writed SET write_gamegrp = ' + QuotedStr('0') + ';';
    UniQuery_Mgr.SQL.Clear;
    UniQuery_Mgr.SQL.Add(sql);
    UniQuery_Mgr.ExecSQL;
  except
    on E : Exception do
    begin
      EGAMEMSG := Format('data updating error: <%s> @ %s',[ E.ToString, DateTimeToStr(now)]);
      Exit;
    end;
  end;

Моя обработка компонентов БД плохая? Другой потокобезопасный метод существует???

0 ответов

Другие вопросы по тегам