Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Транзакция в ZConnection (ZeoS) [D7, MySQL]


lamer6666 ©   (2010-02-01 20:38:00) 

Доброго времени суток уважаемые.
Использую компоненты ZeoS:

Table1 ( Table1_Id,Table1_date_start)
Table2 (Table2_Id, Table2_Table1_Id,Table2_Sum)


 try
   if not Form1.ZConnection1.InTransaction then    
   ZConnection1.StartTransaction;

Добавляю в таблицу Table1 новую запись

Тут мне необходимо в Table2_Table1_Id вписать значение индекса которое было получено в операции добавления выше
   
   ZConnection1.Commit;
 except
   if Form1.ZConnection1.InTransaction then  
   ZConnection1.Rollback;
 end;


Прошу помощи, уважаемые.


lamer6666   (2010-02-08 23:07:00) [1]


> попробуй явно, запросами выполнить, без компонент

я конечно прощу прощения, уважаемый sniknik, но что значит явно запросами, одним запросом?


> сторонней утилитой.

был бы признателен за рекомендацию УТИЛИТЫ.

Заранее благодарю.


sniknik   (2010-02-08 22:37:00) [2]

> Не понятно.
что тут непонятного? транзакция откатится сервером, если клиент не пришлет коммит (прога рухнула/коннект отвалился/и т.д. ) это как бы основное в транзакциях.

> Можеть есть какие идеи?  (((
sniknik ©   (07.02.10 10:12) [6]

> попробуй явно, запросами выполнить, без компонент
> BEGIN TRANSACTION
> COMMIT TRANSACTION
> ROLLBACK TRANSACTION
>
> а то и вообще не в проге на дельфи, а какой нибудь сторонней утилитой.


lamer6666   (2010-02-08 21:54:00) [3]


> наверное в том что при отсутствии коммита, транзакция тоже
> откатывается.

Не понятно.

Суть как раз в "откате". То есть, если нет ошибки в try то все работает успешно, а если возникает исключение, то при Rollback; первый запрос (который без ошибок) выполняется, а второй с ошибками не выполняется, получается что транзакция не работает, ведь должно быть ЛИБО ВСЕ (и ZQ1 и ZQ2), ЛИБО НИЧЕГО (не ZQ1 и не ZQ2).
А вот если я исключаю //Rollback; то при возникновении исключения ни первый (правильно работающий), ни второй запрос (содержащий ошибку) не срабатывает, то что надо.

Читал форумы, выяснил что ZConnection имеет свойство AutoCommit, значение которого по умолчанию True;
Так вот когда я вызываю ZConnection1.StartTransaction; значение AutoCommit меняется на False; (как и ожидал) и как результат, все работает успешно.
Но вот Rollback меняет значение AutoCommit на True; и как следствие (мне кажется) транзакция и срабатывает, не понимаю почему (ведь должен просиходит откат а не подтверждени транзакции). Заметил, что когда я "ремарю"  //Rollback; после выполнения конструкции Try значение AutoCommit остаеться False.

Можеть есть какие идеи?  (((


sniknik   (2010-02-07 14:52:00) [4]

наверное в том что при отсутствии коммита, транзакция тоже откатывается.


lamer6666   (2010-02-07 12:05:00) [5]

Экспериментировал вчера с кодом.
Выяснилось следующее, если я исключаю из кода:

 //Rollback;

то все успешно работает.

В чем тут может быть дело?


lamer6666   (2010-02-07 10:31:00) [6]

Ну в плане типа, конечно InnoDB


sniknik   (2010-02-07 10:12:00) [7]

попробуй явно, запросами выполнить, без компонент
BEGIN TRANSACTION
COMMIT TRANSACTION
ROLLBACK TRANSACTION

а то и вообще не в проге на дельфи, а какой нибудь сторонней утилитой.

>> Виталий Панасенко(дом)   (01.02.10 21:03) [2]
> Спасибо )
спасибо это конечно хорошо, но не адекватно... по нему совершенно не ясен используемый тобой тип таблиц про которые был пост, и от которых многое зависит.
или думаешь тут все телепаты?


Виталий Панасенко(дом)   (2010-02-06 21:11:00) [8]

с дуру можно и ...й поломать.. не смотря на то, что это - гидравлика...:-)


lamer6666   (2010-02-06 15:57:00) [9]

В общем порылся интернет ничего нового не нашел.
Делаю так:

 ZQ1:=TZQuery.Create(self);
 ZQ1.Connection:=Form1.ZConnection1;
 ZQ1.SQL.Text:=' INSERT INTO .... '+
   'VALUES (NULL ,...'''+
 ZQ2:=TZQuery.Create(self);
 ZQ2.Connection:=Form1.ZConnection1;
 ZQ2.SQL.Text:='UPDATE .... ТУТ ДЕЛАЮ УМЫШЛЕННУЮ ОШИБКУ'+

 try
if not Form1.ZConnection1.InTransaction then Form1.ZConnection1.StartTransaction;

{-------Äîáàâëÿåì------}
ZQ1.ExecSQL;
ZQ2.ExecSQL;
{-------Äîáàâëÿåì------}
Form1.ZConnection1.Commit;

 except
   if Form1.ZConnection1.InTransaction then  Form1.ZConnection1.Rollback;
   ShowMessage('Не удается');
 end;

После выполнения кода получаю сообщение Не удаетсяно ZQ1.ExecSQL добавляет данные в таблицу
Что делаю не правильно уважаемые?


lamer6666   (2010-02-01 21:25:00) [10]


> Виталий Панасенко(дом)   (01.02.10 21:03) [2]

Спасибо )


Виталий Панасенко(дом)   (2010-02-01 21:03:00) [11]

и, если тип таблиц MyISAM, то транзакции им не поддерживаются.. InnoDB знаю точно поддерживает


Виталий Панасенко(дом)   (2010-02-01 21:01:00) [12]

и при чем тут транзакция? я давно смотрел на зеосы, возможно, там уже автоматом подстановка идет в мастер-детали...а так - onnewrecord тебе в помощь


Наверх

Титульная страница Поиск, карта сайта Написать письмо