Конференция "Базы" » Транзакция в ZConnection (ZeoS) [D7, MySQL]
 
  • lamer6666 © (01.02.10 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;



    Прошу помощи, уважаемые.
  • Виталий Панасенко(дом) (01.02.10 21:01) [1]
    и при чем тут транзакция? я давно смотрел на зеосы, возможно, там уже автоматом подстановка идет в мастер-детали...а так - onnewrecord тебе в помощь
  • Виталий Панасенко(дом) (01.02.10 21:03) [2]
    и, если тип таблиц MyISAM, то транзакции им не поддерживаются.. InnoDB знаю точно поддерживает
  • lamer6666 © (01.02.10 21:25) [3]

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

    Спасибо )
  • lamer6666 © (06.02.10 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 добавляет данные в таблицу
    Что делаю не правильно уважаемые?
  • Виталий Панасенко(дом) (06.02.10 21:11) [5]
    с дуру можно и ...й поломать.. не смотря на то, что это - гидравлика...:-)
  • sniknik © (07.02.10 10:12) [6]
    попробуй явно, запросами выполнить, без компонент
    BEGIN TRANSACTION
    COMMIT TRANSACTION
    ROLLBACK TRANSACTION

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

    >> Виталий Панасенко(дом)   (01.02.10 21:03) [2]
    > Спасибо )
    спасибо это конечно хорошо, но не адекватно... по нему совершенно не ясен используемый тобой тип таблиц про которые был пост, и от которых многое зависит.
    или думаешь тут все телепаты?
  • lamer6666 © (07.02.10 10:31) [7]
    Ну в плане типа, конечно InnoDB
  • lamer6666 © (07.02.10 12:05) [8]
    Экспериментировал вчера с кодом.
    Выяснилось следующее, если я исключаю из кода:

     //Rollback;



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

    В чем тут может быть дело?
  • sniknik © (07.02.10 14:52) [9]
    наверное в том что при отсутствии коммита, транзакция тоже откатывается.
  • lamer6666 © (08.02.10 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 © (08.02.10 22:37) [11]
    > Не понятно.
    что тут непонятного? транзакция откатится сервером, если клиент не пришлет коммит (прога рухнула/коннект отвалился/и т.д. ) это как бы основное в транзакциях.

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

    > попробуй явно, запросами выполнить, без компонент
    > BEGIN TRANSACTION
    > COMMIT TRANSACTION
    > ROLLBACK TRANSACTION
    >
    > а то и вообще не в проге на дельфи, а какой нибудь сторонней утилитой.
  • lamer6666 © (08.02.10 23:07) [12]

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

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


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

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

    Заранее благодарю.
 
Конференция "Базы" » Транзакция в ZConnection (ZeoS) [D7, MySQL]
Есть новые Нет новых   [134435   +33][b:0][p:0.002]