Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PDO : Транзакция

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
GoDr
Отправлено: 12 Февраля, 2015 - 19:56:07
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




Хочу малость уточнить..

Допустим у меня база InnoDB. Для управления БД использую PDO
Суть вопроса... Если я использую запросы без PDO::beginTransaction(), происходит ли транзакция или нет? Или всё же необходимо "ручками" включать транзакцию?

На сколько я понял из Доков, она якобы автоматом включается, но как это точно знать. И если она включена, то что происходит при повторном вызове beginTransaction?


-----
Система управления веб-содержимым Lotos CMS
 
 Top
Мелкий Супермодератор
Отправлено: 12 Февраля, 2015 - 20:13:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Если сказать begin, то до следующего commit или rollback (и для mysql ещё кучка запросов вроде alter table, call делает неявный commit) все дальнейшие запросы будут проводиться в этой транзакции.

Если транзакция не была запущена явно, то перед каждым следующим запросом транзакция будет стартовать, а после завершения этого запроса - commit.
Без транзакции запрос не может быть выполнен вовсе, он всегда выполняется в рамках транзакции, но без разницы, начатой явно или нет.


-----
PostgreSQL DBA
 
 Top
GoDr
Отправлено: 12 Февраля, 2015 - 20:18:23
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




То есть получается для таблиц которые поддерживаю транзакцию нет смысла заворачиваться с явным вызовом, так?

Просто малость запутался вообще в необходимости PDO::beginTransaction()


PS
пишу новую "обёртку" для работы с БД, вот и упёрся в этот камень. В старой "обёртке" этот функционал был. А тут что-то начал сомневаться..


-----
Система управления веб-содержимым Lotos CMS
 
 Top
teddy
Отправлено: 12 Февраля, 2015 - 20:41:17
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




GoDr пишет:
что происходит при повторном вызове beginTransaction?

Транзакция внутри транзакции? Улыбка) Fatal error.

Смысл отключать автофиксацию в том, когда нужно получить "всё или ничего".
Либо запросы выполняются стопудово(ну, во всяком случае если ответ PHP после "общения" с СУБД таков), либо не выполняется вообще.

Например:

PHP:
скопировать код в буфер обмена
  1. try{
  2.  
  3.     $dbh->beginTransaction();
  4.     $dbh->query('...');
  5.     $dbh->query('...');
  6.     $dbh->query('...');
  7.     $dbh->commit();
  8.  
  9. }catch(PDOException $e){
  10.    
  11.     $dbh->rollBack();  
  12.  
  13. }


если в трайе пойдет что то не так(в контексте PDO), то ни один запрос не будет считаться зафиксированным. Не будь этого механизма, то первый query выполнился бы и было бы плевать если в третьем query произошел error.

(Отредактировано автором: 12 Февраля, 2015 - 20:45:01)

 
 Top
GoDr
Отправлено: 12 Февраля, 2015 - 20:44:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




teddy пишет:
Смысл отключать автофиксацию в том, когда нужно получить "всё или ничего".
Либо запросы выполняются стопудово(ну, во всяком случае если ответ PHP после "общения" с СУБД таков), либо не выполняется вообще.
А разве задача автофиксации не та же самая? Я так понимаю, что если что ни так, то будет откат


-----
Система управления веб-содержимым Lotos CMS
 
 Top
teddy
Отправлено: 12 Февраля, 2015 - 20:48:41
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




GoDr
Я не успел отредактировать сообщение. Так и понял, что будут вопросы.
teddy пишет:
Не будь этого механизма, то первый query выполнился бы и было бы плевать если в третьем query произошел error.
 
 Top
Мелкий Супермодератор
Отправлено: 12 Февраля, 2015 - 20:49:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Заморачиваться стоит, когда нужны транзакции Радость
Чего бы для примера взять?.. Знакомый ДБА говорит, что объяснять лучше на деньгах - быстрее понимают.
Например, делаем цифровую покупку: нам надо списать 100 рублей с баланса пользователя и записать строку в купленные товары пользователя.
Если мы сначала спишем 100 рублей, а затем по какой-нибудь причине умрём (электричество кончилось или банально памяти не хватило) - то на балансе деньги пропадут, а покупки так и не появится. Придётся связываться с саппортом, негативные эмоции клиенту, геморрой программистам в поиске потерянной покупки.
Если наоборот - сначала оформим покупку, а затем захотим списать деньги - внезапно окажется, что у пользователя денег и нету на балансе. Вклинился в другом потоке процесс с другой покупкой и всё списал. Опять айайай и печалька. Ну или опять умерли на полпути - покупка есть и деньги остались.
И тут приходит транзакционность и даёт возможность выполнить оба запроса как одно целое. Или оба запроса будут выполнены и наступит commit или оба запроса будут отменены.

Или когда надо чего-то много записать. commit на каждый запрос всё-таки весьма дорого, там много работы в фоне с транзакционным логом, чтобы ни в коем случае не потерять данные.


-----
PostgreSQL DBA
 
 Top
GoDr
Отправлено: 12 Февраля, 2015 - 20:52:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




Но вопрос остался открытым Закатив глазки Есть ли смысл использовать beginTransaction()
Или так.. Кто-то использует это?
(Добавление)
.
Мелкий пишет:
И тут приходит транзакционность и даёт возможность выполнить оба запроса как одно целое.
ВСЁ!!!! Именно эта фраза меня вклинила... Теперь понял что такое "всё или ничего" Радость

всё так банально...
(Добавление)
.
Всем спасибо, всем по мороженому ;)


-----
Система управления веб-содержимым Lotos CMS
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB