![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транзакция в 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 тебе в помощь