Текущий архив: 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.48 MB
Время: 0.002 c