На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА
Прежде чем задать вопрос, зайдите в раздел FAQ, возможно там уже есть ответ на него.
Если вы хотите вставить код в сообщение, то пожалуйста выделяйте его тегом [code=dfp] ... [/сode].
Для этого используйте кнопку [code=dfp] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Delphi for PHP.
Модераторы: ViktorXP, vicis
  
> Транзакции в реляционной БД
    День добрый!
    Вопрос, собственно, состоит в том как правильно обработать такую ситуацию.
    1) имеется 2 таблицы (мастер-детайл,но не в этом суть)
    2) при вставке пытаюсь использовать такой код
    ExpandedWrap disabled
      try
      {
        $this->DataBase1->BeginTrans();
      ----
        $this->DataBase1->execute(" Insert into master...");   // тут вставка в таблицу мастер
      ---
        $this->DataBase1->execute(" Insert into detail...");  // тут вставка в таблицу детайл
        $this->DataBase1->CompleteTrans();
       
      }
      catch(Exception $e)
       
      {
        $this->DataBase1->CompleteTrans(false);
       
      }


    Так вот,если ошибка происходит при вставке в мастер-то все нормально,а вот если на этапе вставки во вторую таблицу-то в мастер запись все равно вставляется,а не должна. Что-то я делаю не так?
    Сообщение отредактировано: Alex2011 -
      При ошибке надо откатывать транзакцию. Не вижу в приведенном коде RollbackTrans.
        Это $this->DataBase1->CompleteTrans(false);
        Сообщение отредактировано: Alex2011 -
            Поставил вместо методов BeginTrans,CompleteTrans
            ExpandedWrap disabled
                try
                  {
                    $this->Database1->execute("START TRANSACTION;");
                    .
                    .
                    $this->Database1->execute("COMMIT;");
                  }
               catch (Exception $e)
                 {
                    $this->Database1->execute("ROLLBACK;");
                 }


            Заработало как надо. Выходит,проблема в компоненте DataBase?
              Цитата Alex2011 @
              Выходит,проблема в компоненте DataBase?

              скорее в провайдере. так как DataBase абстрактно работает с базой через провайдер (ибо в каждой базе свои приколы и особенности).

                Спасибо за наводку, однако непонятно-есть ли такие методы в компоненте DataBase, во всяком случае, в описании классов не нашел.
                Надо проверять. А еще такой момент-ADO в HTML5Buildere как таковой компонент отсутствует, даже папки нет соответствующей.
                А вот проверку результата по execute, наверно, можно применить. Тоже надо посмотреть будет ли хоть какой-нибудь результат в случае ошибки.

                Цитата ViktorXP @
                скорее в провайдере. так как DataBase абстрактно работает с базой через провайдер (ибо в каждой базе свои приколы и особенности).


                Да,наверно.
                Сообщение отредактировано: Alex2011 -
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0285 ]   [ 15 queries used ]   [ Generated: 25.04.24, 07:50 GMT ]