Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 17.04.2015
Сообщений: 2

Не срабатывает rollback

17.04.2015, 23:22. Показов 2248. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Прошу помощи сам не могу до конца разобраться. Есть такой код:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        protected $_db;
        private  $_items = array();
  function __construct(){
      if(is_file(self::DB_NAME) and filesize(self::DB_NAME) != 0){
        $this->_db = new PDO('sqlite:'.self::DB_NAME);
      }else{
        try{
        $this->_db = new PDO('sqlite:'.self::DB_NAME);
        
        $this->_db->beginTransaction();
        
        $sql = "CREATE TABLE msgs(
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    title TEXT,
                    category INTEGER,
                    description TEXT,
                    source TEXT,
                    datetime INTEGER
                  )";
        $this->_db->exec($sql) or var_dump($this->_db->errorInfo());
        $sql = "CREATE TABLE category(
                      id INTEGER PRIMARY KEY AUTOINCREMENT,
                      name TEXT
                    )";
        $this->_db->exec($sql) or var_dump($this->_db->errorInfo());
        $sql = "INSERT INTO category (id, name)
              SELECT 1 as id, 'Политика' as name
              UNION SELECT 2 as id, 'Культура' as name
              UNION SELECT 3 as id, 'Спорт' as name";
        $this->_db->exec($sql) or var_dump($this->_db->errorInfo());    
        
        $this->_db->commit();
 
    }catch (PDOException $e) {
      $this->_db->rollBack();
      echo $e->getMessage();
    }
    }
    $this->getCategories();
  }
Проблема в том, что если даже в запросах к БД есть ошибки rollBack() не срабатывает и PHP создает файл БД и таблицы (не выполняет только действия, в которых ошибки). А если закомментировать строку
PHP/HTML
1
$this->_db->commit();
тогда rollBack() выполняется даже если в запросах всё правильно (т.е. создается файл БД, а потом все изменения откатываются. Размер файла 0 Байт).
Помогите, пожалуйста, сам не смог разобраться в чём проблема. Как я понимаю, при ошибочном запросе должен выполнится код, расположенный в catch{}, а именно rollBack().
P.S. Если убрать beginTransaction(), commit() и rollBack() тогда всё работает, ошибки отслеживаются, запросы выполняются.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2015, 23:22
Ответы с готовыми решениями:

@Rollback не срабатывает
после запуска junit теста изменяется база хотя не должна, зачем не срабатывает @Rollback @RunWith(SpringJUnit4ClassRunner.class) ...

rollback
Доброго времени суток! Люди добрые помогите мне с задачей, п-ста! У меня есть таблица. Прежде чем удалить какую-то строку в этом таблице, я...

Удаление Rollback
При загрузке вылазет шляпа на две строки, грузит нижнюю и подвисает, как ее убрать, а лучше, чтобы это окно вообще не вылазило, появилось...

2
 Аватар для M9ICHIK
63 / 63 / 23
Регистрация: 09.12.2012
Сообщений: 459
18.04.2015, 18:17
Лучший ответ Сообщение было отмечено Gurikin как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
protected $_db;
        private  $_items = array();
  function __construct()
 {
      if(is_file(self::DB_NAME) and filesize(self::DB_NAME) != 0)
      {
        $this->_db = new PDO('sqlite:'.self::DB_NAME);
      }
      else
     {
$this->_db = new PDO('sqlite:'.self::DB_NAME);
        try{
        
        $this->_db->beginTransaction();
        
        $sql = "CREATE TABLE msgs(
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    title TEXT,
                    category INTEGER,
                    description TEXT,
                    source TEXT,
                    datetime INTEGER
                  )";
        $a = $this->_db->exec($sql);
        if(!$a)
            throw $this->_db->errorInfo();
        $sql = "CREATE TABLE category(
                      id INTEGER PRIMARY KEY AUTOINCREMENT,
                      name TEXT
                    )";
        $b = $this->_db->exec($sql);
       if(!$b)
            throw $this->_db->errorInfo();
        $sql = "INSERT INTO category (id, name)
              SELECT 1 as id, 'Политика' as name
              UNION SELECT 2 as id, 'Культура' as name
              UNION SELECT 3 as id, 'Спорт' as name";
        $d = $this->_db->exec($sql);    
        if(!$d)
              throw $this->_db->errorInfo();
        $this->_db->commit();
 
    }
    catch (PDOException $e) 
    {
      echo $e->getMessage();
      $this->_db->rollBack();
    }
    }
    $this->getCategories();
  }
1
0 / 0 / 0
Регистрация: 17.04.2015
Сообщений: 2
18.04.2015, 19:18  [ТС]
Спасибо огромное за помощь. Нужно подучить использование исключений.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2015, 19:18
Помогаю со студенческими работами здесь

Ошибка синтаксиса в ROLLBACK TO
При попытки вернуться на SAVEPOINT выскакивает ошибка в синтаксисе: "Неправильный синтаксис около ключевого слова "TO"" ...

Откат (ROLLBACK) в MySQL
Всем доброго времени суток! Параметры сервера: InnoDB, autocommit = 1 Подскажите пожалуйста, как поведет себя сервер MySQL при...

commmit/rollback (транзакции)
Господа форумчане помогите разобраться с транзакциями. У меня идея сдеать транзакцией несколько запросов как-то так: $trigg =...

SQLite - триггер и rollback транзакции
Предположим следующие ситуацию. БД sqlite Начата транзакция БД через андроид-программу Запущен код через эту транзакцию на апдейт...

Транзакции. Когда делать rollback?
Подскажите как правильно работать с транзакционной моделью Есть ряд запросов (выполняю в PHP ), которые надо сделать либо все , либо не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru