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
Форумы портала PHP.SU :: Версия для печати :: PDO : Транзакция
Форумы портала PHP.SU » » Работа с СУБД » PDO : Транзакция

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

1. GoDr - 12 Февраля, 2015 - 19:56:07 - перейти к сообщению
Хочу малость уточнить..

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

На сколько я понял из Доков, она якобы автоматом включается, но как это точно знать. И если она включена, то что происходит при повторном вызове beginTransaction?
2. Мелкий - 12 Февраля, 2015 - 20:13:42 - перейти к сообщению
Если сказать begin, то до следующего commit или rollback (и для mysql ещё кучка запросов вроде alter table, call делает неявный commit) все дальнейшие запросы будут проводиться в этой транзакции.

Если транзакция не была запущена явно, то перед каждым следующим запросом транзакция будет стартовать, а после завершения этого запроса - commit.
Без транзакции запрос не может быть выполнен вовсе, он всегда выполняется в рамках транзакции, но без разницы, начатой явно или нет.
3. GoDr - 12 Февраля, 2015 - 20:18:23 - перейти к сообщению
То есть получается для таблиц которые поддерживаю транзакцию нет смысла заворачиваться с явным вызовом, так?

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


PS
пишу новую "обёртку" для работы с БД, вот и упёрся в этот камень. В старой "обёртке" этот функционал был. А тут что-то начал сомневаться..
4. teddy - 12 Февраля, 2015 - 20:41:17 - перейти к сообщению
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.
5. GoDr - 12 Февраля, 2015 - 20:44:56 - перейти к сообщению
teddy пишет:
Смысл отключать автофиксацию в том, когда нужно получить "всё или ничего".
Либо запросы выполняются стопудово(ну, во всяком случае если ответ PHP после "общения" с СУБД таков), либо не выполняется вообще.
А разве задача автофиксации не та же самая? Я так понимаю, что если что ни так, то будет откат
6. teddy - 12 Февраля, 2015 - 20:48:41 - перейти к сообщению
GoDr
Я не успел отредактировать сообщение. Так и понял, что будут вопросы.
teddy пишет:
Не будь этого механизма, то первый query выполнился бы и было бы плевать если в третьем query произошел error.
7. Мелкий - 12 Февраля, 2015 - 20:49:43 - перейти к сообщению
Заморачиваться стоит, когда нужны транзакции Радость
Чего бы для примера взять?.. Знакомый ДБА говорит, что объяснять лучше на деньгах - быстрее понимают.
Например, делаем цифровую покупку: нам надо списать 100 рублей с баланса пользователя и записать строку в купленные товары пользователя.
Если мы сначала спишем 100 рублей, а затем по какой-нибудь причине умрём (электричество кончилось или банально памяти не хватило) - то на балансе деньги пропадут, а покупки так и не появится. Придётся связываться с саппортом, негативные эмоции клиенту, геморрой программистам в поиске потерянной покупки.
Если наоборот - сначала оформим покупку, а затем захотим списать деньги - внезапно окажется, что у пользователя денег и нету на балансе. Вклинился в другом потоке процесс с другой покупкой и всё списал. Опять айайай и печалька. Ну или опять умерли на полпути - покупка есть и деньги остались.
И тут приходит транзакционность и даёт возможность выполнить оба запроса как одно целое. Или оба запроса будут выполнены и наступит commit или оба запроса будут отменены.

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

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

 

Powered by ExBB FM 1.0 RC1