Lev-IT-áció

Ez a kis Blog IT fejlesztéshez kapcsolódó témaköröket fog boncolgatni, amelyeket igyekezni fogok gyakorlatiasan megfogalmazni, elemelkedve az elméleti síkról.

Rólam azt kell tudni, hogy már évek óta fejlesztek nagyvállalati, banki egyedi szoftvereket és hát mit mondjak szeretem ezt a szakmát.

A blog témájába beleesik a szembejövő kisebb-nagyobb probléma körök tárgyalása ugyanúgy mint a különböző példakód jellegű „móriczka” kódolás, egyes technológiák bemutatásáról. Így bizony felfog tűnni a blogban az érdeklődési körömbe eső összes technológia – előbb utóbb ;). Ezek a teljesség igénye nélkül (mire is lehet itt számítani):
- .Net programozás. (VB.Net, C#.Net, ASP.NET)
- SQL programozás
- Ismertebb adatbázis kezelők (MS SQL Server, Oracle)
- Kissé egzotikusabb (kevésbé elterjedt) adatbázis kezelők (PostgreSQL, FireBird)
- Java
- Fejlesztési módszertanok


Fogjátok azt is látni, hogy a fenti témákban vannak nálam jártasabb emberek is, de a magyar nyelvű blog szféra szerintem annyira szegényes ezekben a témakörökben, hogy én még simán beférek ide ;D

Remélem mindenkinek tetszeni fog! :)

Címkék

.net (8) adatbázis (3) ajax (1) asp.net (4) c# (6) debian (1) firebird (1) hash (1) java (1) linux (2) masterpage (1) mono (1) monodevelop (1) ms sql (1) mysql (1) oracle (1) postgresql (4) SHA256 (1) sql (5) szekvencia (1) tomcat (1) tools (1) üzemeltetés (1) visual basic (5) Címkefelhő

PostgreSQL tranzakció probléma a tárolt eljárásban.

2011.05.22. 09:28 :: apriliars

A cím egy kicsit megtévesztő lehet. Ugye PostgreSQL-ben nincs tárolt eljárás, hanem olyan funkciók vannak, amelyek nem térnek vissza értékkel (pontosabban: returns void AS $$).
PostgreSQL kapcsolatban gyakran elhangzik, hogy fejlett tranzakció kezeléssel rendelkezik, ami tulajdonképpen igaz is. De akkor mi is a probléma?

Próbáljuk ki a következőt:
Hozzunk létre egy táblát.

CREATE TABLE Test
(
 Data VARCHAR(15)
,UNIQUE (Data)
)

 

Illetve egy tárolt eljárást:
CREATE OR REPLACE FUNCTION AddTestItem
(
    p_item VARCHAR(15)
)
RETURNS void AS $$
BEGIN
    INSERT INTO test VALUES (p_item);
    INSERT INTO test VALUES (p_item);
END
$$ LANGUAGE plpgsql;

SELECT addtestitem( 'adat')

Futtassuk le! Egy hiba üzenetet fog fogadni, hogy nem lehet hozzáadni a második elemet az egyedi kulcs miatt. Ha megnézzük a tábla tartalmát, láthatjuk, hogy nem is adott hozzá semmit, az első sikeres insert is visszagörgetődött automatikusan. Ez eddig jól hangzik! Akkor mi is a bajom?

Próbáljuk ki a következőt:

CREATE OR REPLACE FUNCTION AddTestItem
(
    p_item VARCHAR(15)
)
RETURNS void AS $$
BEGIN
    INSERT INTO test VALUES (p_item);
    ROLLBACK;
END
$$ LANGUAGE plpgsql;

SELECT addtestitem( 'adat')

A következő történik:
ERROR: SPI_execute_plan failed executing query "rollback": SPI_ERROR_TRANSACTION
SQL state: XX000
Context: PL/pgSQL function "addtestitem" line 3 at SQL statement

Hasonló az eredmény ha commit-ot használnánk, vagy esetleg savepoint-ot építünk be és addig görgetnénk vissza.
Ennek az az oka, függvény már így is tartalmaz egy tranzakciót, a PostgreSQL nem támogatja a beágyazott tranzakciókat. Legalábbis ilyesmit olvastam a neten. A dokumentációban ugyanis nincs erre vonatkozó megjegyzés. Mivel viszont tárolt eljárást, csak függvényben lehet deklarálni, ezért a kör bezárult! Nincs lehetőség tárolt eljárás keretében hibaüzenet nélküli tranzakciós műveletekre! (rollback, commit)

De ha nekem mégis kell akkor mit kell csinálni?
Vagy a program felületről indított tranzakcióval kezeljük le az ilyen eseteket vagy...

Ha mondjuk olyan rollback-et szeretnénk végerhajtani, amely nem jár hibaüzenettel, akkor valami ilyesmit lehet végrehajtani:

CREATE OR REPLACE FUNCTION AddTestItem
(
    p_item VARCHAR(15)
)
RETURNS void AS $$
BEGIN
    INSERT INTO test VALUES (p_item);
    RAISE EXCEPTION 'Elszállás';
EXCEPTION
WHEN OTHERS THEN
    NULL
;
END
$$ LANGUAGE plpgsql;

 

És ha commit-ot vagy savepoint-ot szeretnénk? Azon még nekem is gondolkodnom kell egy kicsit :D

Szólj hozzá!

Címkék: sql postgresql

A bejegyzés trackback címe:

https://lev-it-acio.blog.hu/api/trackback/id/tr862922926

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása