-
Доброго времени суток уважаемые. Использую компоненты 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;
Прошу помощи, уважаемые.
-
и при чем тут транзакция? я давно смотрел на зеосы, возможно, там уже автоматом подстановка идет в мастер-детали...а так - onnewrecord тебе в помощь
-
и, если тип таблиц MyISAM, то транзакции им не поддерживаются.. InnoDB знаю точно поддерживает
-
> Виталий Панасенко(дом) (01.02.10 21:03) [2]
Спасибо )
-
В общем порылся интернет ничего нового не нашел. Делаю так:
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 добавляет данные в таблицу Что делаю не правильно уважаемые?
-
с дуру можно и ...й поломать.. не смотря на то, что это - гидравлика...:-)
-
попробуй явно, запросами выполнить, без компонент BEGIN TRANSACTION COMMIT TRANSACTION ROLLBACK TRANSACTION
а то и вообще не в проге на дельфи, а какой нибудь сторонней утилитой.
>> Виталий Панасенко(дом) (01.02.10 21:03) [2] > Спасибо ) спасибо это конечно хорошо, но не адекватно... по нему совершенно не ясен используемый тобой тип таблиц про которые был пост, и от которых многое зависит. или думаешь тут все телепаты?
-
Ну в плане типа, конечно InnoDB
-
Экспериментировал вчера с кодом. Выяснилось следующее, если я исключаю из кода: то все успешно работает. В чем тут может быть дело?
-
наверное в том что при отсутствии коммита, транзакция тоже откатывается.
-
> наверное в том что при отсутствии коммита, транзакция тоже > откатывается.
Не понятно.
Суть как раз в "откате". То есть, если нет ошибки в try то все работает успешно, а если возникает исключение, то при Rollback; первый запрос (который без ошибок) выполняется, а второй с ошибками не выполняется, получается что транзакция не работает, ведь должно быть ЛИБО ВСЕ (и ZQ1 и ZQ2), ЛИБО НИЧЕГО (не ZQ1 и не ZQ2). А вот если я исключаю //Rollback; то при возникновении исключения ни первый (правильно работающий), ни второй запрос (содержащий ошибку) не срабатывает, то что надо.
Читал форумы, выяснил что ZConnection имеет свойство AutoCommit, значение которого по умолчанию True; Так вот когда я вызываю ZConnection1.StartTransaction; значение AutoCommit меняется на False; (как и ожидал) и как результат, все работает успешно. Но вот Rollback меняет значение AutoCommit на True; и как следствие (мне кажется) транзакция и срабатывает, не понимаю почему (ведь должен просиходит откат а не подтверждени транзакции). Заметил, что когда я "ремарю" //Rollback; после выполнения конструкции Try значение AutoCommit остаеться False.
Можеть есть какие идеи? (((
-
> Не понятно. что тут непонятного? транзакция откатится сервером, если клиент не пришлет коммит (прога рухнула/коннект отвалился/и т.д. ) это как бы основное в транзакциях.
> Можеть есть какие идеи? ((( sniknik © (07.02.10 10:12) [6]
> попробуй явно, запросами выполнить, без компонент > BEGIN TRANSACTION > COMMIT TRANSACTION > ROLLBACK TRANSACTION > > а то и вообще не в проге на дельфи, а какой нибудь сторонней утилитой.
-
> попробуй явно, запросами выполнить, без компонент
я конечно прощу прощения, уважаемый sniknik, но что значит явно запросами, одним запросом?
> сторонней утилитой.
был бы признателен за рекомендацию УТИЛИТЫ.
Заранее благодарю.
|