Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.06;
Скачать: CL | DM;

Вниз

Транзакция в ZConnection (ZeoS)   Найти похожие ветки 

 
lamer6666 ©   (2010-02-01 20:38) [0]

Доброго времени суток уважаемые.
Использую компоненты 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;


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


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

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


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

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


 
lamer6666 ©   (2010-02-01 21:25) [3]


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

Спасибо )


 
lamer6666 ©   (2010-02-06 15:57) [4]

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

 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 добавляет данные в таблицу
Что делаю не правильно уважаемые?


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

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


 
sniknik ©   (2010-02-07 10:12) [6]

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

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

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


 
lamer6666 ©   (2010-02-07 10:31) [7]

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


 
lamer6666 ©   (2010-02-07 12:05) [8]

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

 //Rollback;

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

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


 
sniknik ©   (2010-02-07 14:52) [9]

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


 
lamer6666 ©   (2010-02-08 21:54) [10]


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

Не понятно.

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

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

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


 
sniknik ©   (2010-02-08 22:37) [11]

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

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

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


 
lamer6666 ©   (2010-02-08 23:07) [12]


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

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2011.11.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
1-1271087156
Delp
2010-04-12 19:45
2011.11.06
Копирование вкладки с PageControl а


1-1271933869
Handbrake
2010-04-22 14:57
2011.11.06
Вопрос по взаимодействию компонентов.


1-1271836929
pasha_golub
2010-04-21 12:02
2011.11.06
Exceptions Type to Ignore не работает


3-1265342997
Степан
2010-02-05 07:09
2011.11.06
IBDataset обновляет не все поля


3-1265045910
lamer6666
2010-02-01 20:38
2011.11.06
Транзакция в ZConnection (ZeoS)