2016-09-12 2 views
0

Я в процессе обновления нашей базы кода с PHP5.4 до PHP7. в наших тестах мы завершаем весь тест в транзакции командойmysqli эквивалент mysql_query ("BEGIN")

mysql_query ("BEGIN");

затем сделать кучу вещей

mysql_query ("ROLLBACK");

тогда все между этими двумя командами рассматривалось как транзакция и может быть отброшено в конце теста. Я не смог достичь этой функциональности в PHP7 с помощью mysqli. я попытался использовать функцию mysqli_autocommit, но тогда это не позволяло различным запросам в тесте иметь доступ к созданным данным ранее в тесте. как будто каждая вставка была в своей транзакции.

UPDATE:

проблема в том, что каждый раз, когда я создать новый адаптер к столу, кажется, я создаю новое подключение к БД. с PHP5 и командой выше mysql_query («BEGIN») «КАЖДОЕ соединение было включено в эту транзакцию, и все заявления можно было отбросить назад. Я не нашел способ сделать это с помощью php7. если я использую

$mysqli->begin_transaction(); 

тогда ТОЛЬКО одно соединение является частью транзакции. для того, чтобы достичь желаемой функциональности, я должен неявно заставить адаптер EVERY использовать существующее соединение, а не создавать свои собственные. Я предполагаю, что возможно, что PHP7 делает это автоматически для вас? так как теперь единственный способ понять, как это сделать, - установить GLOBAL и, если он существует, использовать соединение, а не создавать новый. поэтому мой вопрос по-прежнему стоит, есть ли способ заставить все соединения, которые открываются, чтобы быть включенными в транзакцию, которую можно отбросить назад, а еще один вопрос - вот что лучше всего подходит для повторного использования соединений, поскольку я уверен, что настройка глобальный - это неправильный способ сделать это.

Я использую MySQL 5.5.52. PHP 7.0.10

+0

См. Http://php.net/manual/en/mysqli.begin-transaction.php –

+0

@RocketHazmat Я пробовал это, но все вставки и обновления регистрируются как завершенные и доступны полностью после завершения теста. – radamnyc

+0

Что такое механизм базы данных? –

ответ

3

я предполагаю, что, вероятно, путь, который PHP7 делает это автоматически для вас?

No.

единственным способом я мог понять, как сделать это, чтобы установить GLOBAL

Не совсем.

Вместо этого вы можете использовать OOP и предоставить один экземпляр SQL-адаптера для всех классов, которые могут ему понадобиться. Однако, если ваш код является процедурным, вы можете сохранить либо глобальную переменную, либо один вспомогательный класс.

+0

, так считается плохой практикой, чтобы открыть новое соединение для каждого запроса db, а затем для определенного сеанса? – radamnyc

+0

да, точно. Я бы даже сказал, что это неприемлемая практика - как для производительности, так и для удобства использования –

Смежные вопросы