Конференция "Базы" » блокировка таблицы myisam [D7, MySQL]
 
  • _guest_ (14.03.13 15:29) [0]
    Только начал разбираться с mysql. Теории почти ноль, но я работаю в этом направлении. delphi2007, mysql 4.1, dbExpress, таблица myisam. Не работает код:

    procedure Tfrm.Button1Click(Sender: TObject);
    var
     Id : Integer;
    begin
     try
       with SQLQuery1 do
       begin
         Close;
         SQL.Clear;
         SQL.Add('LOCK TABLES contragents Write');
         ExecSQL;
         SQL.Clear;
         SQL.Add('Insert into contragents () values ()');
         ExecSQL;
         SQL.Clear;
    //      SQL.Add('Select last_insert_id() as id');
         SQL.Add('SELECT id FROM contragents ORDER BY id DESC limit 1');
         Open;
         id := FieldByName('id').AsInteger;

         SQL.Clear;
         SQL.Add('UNLOCK TABLES');
         ExecSQL;

         Close;
       end;
     except on E:exception do
       begin
         messagedlg('Ошибочное значение :' + E.Message + '!', mtError, [mbOk], 0);
       end;
     end;
     messagedlg(IntToStr(id), mtInformation, [mbOk], 0);
    end;


    В таблице автоинкрементное поле Id. Цель: при вставке надо узнать идентификатор вставленной строки и дальше его использовать. На
    Open

    программа встает без сообщений, ошибок и т.п. Неужели клиент поставивший блокировку на запись, не может выполнить чтение?
    В какую сторону копать, чтобы добиться заданной выше цели?
    Кстати
    last_insert_id()

    всегда возвращает ноль, может поэтому поводу тоже меня просветите?
  • знайка (14.03.13 15:53) [1]

    > Кстати last_insert_id()  всегда возвращает ноль, может поэтому
    > поводу тоже меня просветите?
    разве в хелпе мало?
  • _guest_ (14.03.13 16:09) [2]

    > знайка   (14.03.13 15:53) [1]
    > разве в хелпе мало?

    Не мало, второй день читаю. Но в чем причина так и не понял. Про какие-либо ограничения на myisam я не нашел, а пока в голову приходит только это.
  • sniknik © (14.03.13 17:27) [3]
    > last_insert_id
    это типа @@IDENTITY в mssql? типа с действием на сессию (не вижу указания таблицы как в IDENT_CURRENT)
    тогда может зависеть от того настроен ли компоненту SQLQuery постоянный коннект, или прописана строка подключения (?) и он пере создается на каждый запрос (а соответственно и сессия накрывается)

    также может зависеть от настройки в коннекте типа "кипконестион".
  • sniknik © (14.03.13 17:33) [4]
    ++
    сори, не обратил внимания на "dbExpress"... там вроде нет строк коннекта в кверях... т.е. сразу см. второе.

    а кстати пакеты из комманд MySQL позволяет?
  • _guest_ (14.03.13 17:38) [5]

    > sniknik ©   (14.03.13 17:27) [3]

    так точно: с действием на сесию. keepconnection = true, В компоненте SQLQuery прописан SQLConnection = SQLConnection1 и подключение прописано уже в нем, не знаю накрывается ли в этом случае сессия, но если да, то с last_insert_id становится понятно. Указание таблицы тоже ничего не меняет. Но основной то вопрос у меня по блокировке...
  • _guest_ (14.03.13 21:42) [6]
    Так... эксперименты показали следующее:
    выполнение запроса
    LOCK TABLES contragents Write;
    Insert into contragents () values ();
    SELECT id FROM contragents ORDER BY id DESC limit 1;
    UNLOCK TABLES;



    в программе-администраторе heidiSQL приводят к необходимому и ожидаемому результату в виде последнего значения автоинкремента. Т.е. моя проблема не в SQL, а в неправильном использовании delphi/dbexpress.

    Причем в первом посте я привел хоть и опробованный, но все-таки упрощенный код. Рабочий фрагмент отличается только тем, что имя базы, имена столбцов и устанавливаемых значений передаются строковыми переменными при
    SQL.ADD(...)

     Так вот, в этом куске кода программа встает еще на том
    ExecSQL;

    который после инсерта. Подскажите, какими средствами отладки (особенно если они в самой D2007) можно пользоваться в этом случае. Хотя понятно что дело в кривой блокировке, только как эту "кривость" победить? Как добиться выполнения запросов в одной ... даже и не знаю ... сессия вроде одна, транзакций в myism нет...
  • _guest_ (16.03.13 11:54) [7]
    Отвечаю, если кому интересно:
    при доступе через Zeos все работает. Это не значит что dbExpress не работает, точнее необязательно это так, может я чего то не донастроил. Но все равно как то странно, что что-то работает, а что-то нет. Не исключаю, что в зевсе не будет работать что-либо другое :) Оставлю оба компонента :) все равно выяснить причину неработоспособности не смогу. И кстати: в зевсе корректно работает и last_insert_id. Повторюсь: в коде не менял ни символа только SQLQuery на ZQuery и все заработало.
 
Конференция "Базы" » блокировка таблицы myisam [D7, MySQL]
Есть новые Нет новых   [119451   +49][b:0][p:0.001]