PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Транзакционни ли са функциите на PostgreSQL?

Актуализация на PostgreSQL 12 :има ограничена поддръжка за PROCEDURE от най-високо ниво които могат да извършват контрол на транзакциите. Все още не можете да управлявате транзакции в обикновени функции, извиквани от SQL, така че следното остава вярно, освен когато използвате новите процедури от най-високо ниво.

Функциите са част от транзакцията, от която са извиквани. Техните ефекти се отменят, ако транзакцията се върне назад. Тяхната работа се ангажира, ако транзакцията се ангажира. Всяко BEGIN ... EXCEPT блоковете във функцията работят като (и използват под капака) точки за запис като SAVEPOINT и ROLLBACK TO SAVEPOINT SQL изрази.

Функцията или е успешна в своята цялост, или се проваля изцяло, с изключение на BEGIN ... EXCEPT обработка на грешки. Ако във функцията се повдигне грешка и не се обработва, транзакцията, извикваща функцията, се прекратява. Прекъснатите транзакции не могат да завършат и ако се опитат да извършат COMMIT се третира като ROLLBACK , както и за всяка друга транзакция с грешка. Наблюдавайте:

regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR:  division by zero
regress=# COMMIT;
ROLLBACK

Вижте как транзакцията, която е в състояние на грешка поради нулево деление, се връща обратно при COMMIT ?

Ако извикате функция без изрична заобикаляща транзакция, правилата са абсолютно същите като за всеки друг израз Pg:

BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;

(където COMMIT ще се провали, ако SELECT повдигна грешка).

PostgreSQL (все още) не поддържа автономни транзакции във функции, където процедурата/функцията може да извърши/връща обратно независимо от извикващата транзакция. Това може да се симулира с помощта на нова сесия чрез dblink.

НО , неща, които не са транзакционни или са несъвършени транзакционни, съществуват в PostgreSQL. Ако има нетранзакционно поведение в нормален BEGIN; do stuff; COMMIT; блок, той също има нетранзакционно поведение във функция. Например, nextval и setval , TRUNCATE и др.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django ConnectionAbortedError:[WinError 10053] Установена връзка е прекъсната от софтуера на вашата хост машина

  2. Преглед на предложенията на Amazon RDS и Aurora за PostgreSQL

  3. Използване на криптиране за засилване на сигурността на базата данни на PostgreSQL

  4. Как да конфигурирате AppArmor за PostgreSQL и TimescaleDB

  5. Какво е сканиране на растерна памет в план за заявка?