Хочу малость уточнить..
Допустим у меня база InnoDB. Для управления БД использую PDO
Суть вопроса... Если я использую запросы без PDO::beginTransaction(), происходит ли транзакция или нет? Или всё же необходимо "ручками" включать транзакцию?
На сколько я понял из Доков, она якобы автоматом включается, но как это точно знать. И если она включена, то что происходит при повторном вызове beginTransaction?
1. GoDr - 12 Февраля, 2015 - 19:56:07 - перейти к сообщению
2. Мелкий - 12 Февраля, 2015 - 20:13:42 - перейти к сообщению
Если сказать begin, то до следующего commit или rollback (и для mysql ещё кучка запросов вроде alter table, call делает неявный commit) все дальнейшие запросы будут проводиться в этой транзакции.
Если транзакция не была запущена явно, то перед каждым следующим запросом транзакция будет стартовать, а после завершения этого запроса - commit.
Без транзакции запрос не может быть выполнен вовсе, он всегда выполняется в рамках транзакции, но без разницы, начатой явно или нет.
Если транзакция не была запущена явно, то перед каждым следующим запросом транзакция будет стартовать, а после завершения этого запроса - commit.
Без транзакции запрос не может быть выполнен вовсе, он всегда выполняется в рамках транзакции, но без разницы, начатой явно или нет.
3. GoDr - 12 Февраля, 2015 - 20:18:23 - перейти к сообщению
То есть получается для таблиц которые поддерживаю транзакцию нет смысла заворачиваться с явным вызовом, так?
Просто малость запутался вообще в необходимости PDO::beginTransaction()
PS
пишу новую "обёртку" для работы с БД, вот и упёрся в этот камень. В старой "обёртке" этот функционал был. А тут что-то начал сомневаться..
Просто малость запутался вообще в необходимости PDO::beginTransaction()
PS
пишу новую "обёртку" для работы с БД, вот и упёрся в этот камень. В старой "обёртке" этот функционал был. А тут что-то начал сомневаться..
4. teddy - 12 Февраля, 2015 - 20:41:17 - перейти к сообщению
GoDr пишет:
что происходит при повторном вызове beginTransaction?
Транзакция внутри транзакции? ) Fatal error.
Смысл отключать автофиксацию в том, когда нужно получить "всё или ничего".
Либо запросы выполняются стопудово(ну, во всяком случае если ответ PHP после "общения" с СУБД таков), либо не выполняется вообще.
Например:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- try{
- $dbh->beginTransaction();
- $dbh->query('...');
- $dbh->query('...');
- $dbh->query('...');
- $dbh->commit();
- }catch(PDOException $e){
- $dbh->rollBack();
- }
если в трайе пойдет что то не так(в контексте PDO), то ни один запрос не будет считаться зафиксированным. Не будь этого механизма, то первый query выполнился бы и было бы плевать если в третьем query произошел error.