Транзакции PHP и PostgreSQL? - PullRequest
       22

Транзакции PHP и PostgreSQL?

2 голосов
/ 10 декабря 2010

Давным-давно я написал класс php, который обрабатывает соединения db с postgresql.
Я добавил транзакции к своим функциям вставки / обновления, и они прекрасно работают для меня. Но недавно я узнал о функции "pg_prepare".
Я немного озадачен тем, что делает эта функция, и будет ли лучше переключиться на нее.

В настоящее время, когда я делаю вставку / обновление, мой sql выглядит так:

$transactionSql = "PREPARE TRANSACTION ".md5(time()).";"
                  .$theUpdateOrDeleteSQL.";".
                  ."COMMIT;";

This will return something like:
PREPARE TRANSACTION '4601a2e4b4aa2632167d3cc62b516e6d';
INSERT INTO users (username,g_id,email,password)
            VALUES('test',  '1', 'test','1234');
COMMIT;

Я структурировал свою базу данных отношениями и использую (когда это возможно):

 ON DELETE CASCADE
 ON UPDATE CASCADE

Но я хочу быть на 100% уверенным, что в базе данных все чисто, и нет остатков, если / когда произошел сбой при обновлении / удалении или вставке.

Было бы неплохо, если бы вы поделились своим мнением / опытом в отношении pg_prepare, действительно ли мне нужна "подготовка транзакции" и какие-либо другие дополнительные вещи, которые могут мне помочь? :)

Ответы [ 2 ]

4 голосов
/ 12 декабря 2010

Нет, вам не нужно двухфазное принятие! ​​...

Для безопасной обработки базы данных PHP не используйте напрямую pg_query, а оберните его в специальную функцию, которая выполняет следующие действия:

  • открывает соединение с базой данных при первом запросе
  • , если используются постоянные соединения, убедитесь, что соединение находится в известном состоянии
  • register_shutdown_function для функции, которая выдает ROLLBACK
  • убедитесь, что автокоммит выключен, или просто введите BEGIN перед первым запросом
  • ошибка базы данных журнала и медленные запросы
  • использует только pg_query_params (), которая прекрасно заботится о SQL-инъекциях

Таким образом, если ваш скрипт вылетает или что-то еще, откат выполняется автоматически.Вы можете сделать коммит только явным коммитом.

Если вы используете постоянные соединения, будьте осторожны: обработка pg_pconnect в php немного ... глючит.

3 голосов
/ 10 декабря 2010

Нет, вам не нужно готовить транзакцию (которая предназначена для распределенных транзакций на разных серверах - как уже указывал Милен.

Я не уверен, как интерфейс PHP это обрабатывает, но покапоскольку вы можете убедиться, что вы не работаете в режиме автоматической фиксации, все должно быть в порядке.

Если вы не можете управлять режимом автоматической фиксации, просто поместите свои операторы в BEGIN ... COMMIT блок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...