/ / PHP и PostgreSQL транзакции? - php, sql, база данни, postgresql

PHP и PostgreSQL транзакции? - php, sql, база данни, postgresql

Много отдавна съм написал клас на php, който се занимава с връзки postgresql db.
Аз добавих транзакции към моите функции за вмъкване / актуализиране и работи добре за мен. Но напоследък разбрах за функцията "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, наистина ли се нуждая от "подготвителната транзакция" и от всякакви други неща, които биха могли да ми помогнат? :)

Отговори:

3 за отговор № 1

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

Аз не съм сигурен как PHP интерфейсът се справя с това, но докато можете да сте сигурни, че не сте в режим на автоматичен ангажимент, нещата трябва да са наред.

Ако не можете да контролирате режима за автоматичен ангажимент, просто поставете изявленията си в a ЗАПОЧНЕТЕ ... COMMIT блок


4 за отговор № 2

Не, не се нуждаете от 2 фази!

За безопасно боравене с PHP база данни, не използвайте pg_query директно, а го обвийте в специална функция, която прави следното:

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

По този начин, ако вашият сценарий се срине или нещо подобно, се появява автоматично връщане назад. Можете да се ангажирате само чрез изрично ангажиране.

Ако използвате постоянни връзки, пазете се: работата на php на pg_pconnect е малко ... buggy.