SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.03.2013 16:32:35

Ден
Участник
Зарегистрирован: 14.03.2013
Сообщений: 3

блокировка таблицы myisam

Я понимаю, что для делфи есть свои форумы, но у меня проблема кажется с 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 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 программа встает без сообщений, ошибок и т.п. Неужели клиент поставивший блокировку на запись, не может выполнить чтение?
В какую сторону копать, чтобы добиться заданной выше цели?

Неактивен

 

#2 15.03.2013 14:29:47

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: блокировка таблицы myisam

Какая именно ошибка возникает?
Последнее вставленное значение можно получить с помощью:

SELECT last_insert_id();

Неактивен

 

#3 16.03.2013 09:13:40

Ден
Участник
Зарегистрирован: 14.03.2013
Сообщений: 3

Re: блокировка таблицы myisam

> rgbeast Какая именно ошибка возникает?

Никакая, программа встает намертво, ощущение что ждет окончания блокировки.
Хотя все тоже самое через программу-администратора heidiSQL выполняется правильно.

>Последнее вставленное значение можно получить с помощью:
>SELECT last_insert_id();

Я знаю, но у меня во всех случаях возвращает 0. last_insert_id() налагает требование, чтобы
все было в одной сессии, я не знаю как это проконтролировать, а транзакции myisam не
поддерживает. Если бы last_insert_id() сработал, мне не пришлось бы блокировать таблицу,
так как он возвращает значение именно для этой сессии и действия других клиентов на
это никак не влияют. Остается либо перейти с myisam на другой тип, пока базы пустые,
либо попробовать доступ через другие компоненты, так как есть косвенные подозрения,
что это глючит dbExpress.

Неактивен

 

#4 16.03.2013 11:57:11

Ден
Участник
Зарегистрирован: 14.03.2013
Сообщений: 3

Re: блокировка таблицы myisam

Заменил dbExpress на Zeos и все заработало, даже last_insert_id

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson