Код (Text): $db->beginTransaction(); // тут большое количество операций в БД, select insert update delete // "коммита" нету!!! я правильно понимаю, что пока нет коммита, никаких изменений в БД не должно быть, после того как отработает скрипт? или нет? т.е. Код (Text): $db->beginTransaction(); // тут большое количество операций в БД, select insert update delete $db->commit(); // вот только сейчас будут изменения в БД, верно? Или все же, после открытия транзакции изменения в БД происходят, и если нет коммита, надо $db->rollBack(); вызвать что бы убрать изменения???
myisam не поддерживает транзацкии и лепит сразу изменения =) ты проверь, что у тебя innodb или ченить такое же умное
Завершение соединения с сервером без комита подразумевает роллбек. Но лучше всегда это делать руками явно. На практике могут быть проблемы при наличии пула соединений между пхп и базой. Добавлено спустя 3 минуты 15 секунд: Хотя может он на фантомное чтение наткнулся. Нет, что бы проблему описать.
ну естесьна innodb там ) видимо да, тут проблемка, exit; нету в скрипте ) вот из дока а если скрипт еще не завершился, лепит все что угодно ((( даже если фиксации не было ((( как то сука не логично (
если честно, я всегда рассуждал так: открыли транзакцию, и пока мы ее не "закоммитили" - никаких изменений я ошибался )
может кому-то это уже очевидно, но я скажу: чтобы ТРЕБОВАЛСЯ ЯВНЫЙ commit, надо указывать \PDO::ATTR_AUTOCOMMIT = false. иначе он происходит неявно после каждого запроса.
В той же сессии, что запущена транзакция? Т.е. делаешь инсерт, потом сразу же селект - и данных нет? Не, ну это надо одаренным быть, что бы так думать
Дмитрий, ты видимо слегка запутался в наблюдениях. Мускуль не врет и дока по PDO тоже. Не может часть зафиксироваться, а часть нет. Проверяй себя: движок точно InnoDb, транзакция точно стартована явно, проверяешь точно в другом соединении и т.д. и т.п.
Да, немного путанул ))) Просто раньше, я "дебажил" так: перед коммитом exit; и тогда транзакция автоматом откатывалась тут немножко другая ситуация, скрипт продолжает работу, но даже без коммита изменения заносятся, надо откатывать транзакцию rollBack(), тогда все ровно Всем спасибо! ) Добавлено спустя 27 секунд: именно так я и считал )
Считал как я сказал или igordata? Пока нет комита - другие подключения данных не видят, за исключением новых инсертов, чего тоже можно избежать.