postgres numer transakcji
Herakles - 12-01-2007 00:29
postgres numer transakcji
Witam, BEGIN potrzebny mi numer transakcji w jakim obecnie się znajduję aby trigery wrzucały zadania do wykonania do tabelki razem z numerem transakcji, wiem wiem temp tabela ale nie tu się nie sprawdzi. A na końcu transakcji zrobić select * from do_my_works(); oczywiście numer jest mi potzrebny po to aby zadania wyznaczone przez trigery można było wykonać kiedy indziej. COMMIT;
hubert depesz lubaczewski - 12-01-2007 00:29
On 2007-01-11, Herakles <herakles@buziaczek.pl> wrote: > potrzebny mi numer transakcji w jakim obecnie się znajduję aby trigery > wrzucały zadania do wykonania do tabelki razem z numerem transakcji, wiem > wiem temp tabela ale nie tu się nie sprawdzi. A na końcu transakcji zrobić > select * from do_my_works(); > oczywiście numer jest mi potzrebny po to aby zadania wyznaczone przez > trigery można było wykonać kiedy indziej.
coś mi się tłucze po głowie, że jest taka funkcja, ale jakos nie mogę jej teraz znaleźć. bez funkcji jednakże jest to i tak proste.
robisz sobie (raz) tabelkę. nie temp-tabelkę. np. taką: create table x (i int4); potem: (w transakcji której id cię interesuje: # insert into x (i) values (pg_backend_pid()); # select xmin from x where i = pg_backend_pid(); # delete from x where i = pg_backend_pid();
select zwróci ci id aktualnej transakcji. nie jest to może ultra-ładne. ale działa.
depesz
-- http://www.depesz.com/ - blog dla ciebie
Herakles - 12-01-2007 00:29
hubert depesz lubaczewski wrote:
> coś mi się tłucze po głowie, że jest taka funkcja, ale jakos nie mogę > jej teraz znaleźć. bez funkcji jednakże jest to i tak proste. > > robisz sobie (raz) tabelkę. > nie temp-tabelkę. > np. taką: > create table x (i int4); > potem: > (w transakcji której id cię interesuje: > # insert into x (i) values (pg_backend_pid()); > # select xmin from x where i = pg_backend_pid(); > # delete from x where i = pg_backend_pid(); > > select zwróci ci id aktualnej transakcji. > nie jest to może ultra-ładne. ale działa. > > depesz
że też wcześniej na to nie wpadłem, chociaż faktycznie nieeleganckie, ale naprowadziłeś mnie na odpowiedni tok myślenia, dzięki:
BEGIN select transactionid from pg_locks where pid=pg_backend_pid() and locktype='transactionid'; COMMIT
Każda transakcja zakłada lock na samą siebie, każde połączenie to jeden proces, czyli w sumie jest to co chciałem.
hubert depesz lubaczewski - 13-01-2007 00:00
On 2007-01-11, Herakles <herakles@buziaczek.pl> wrote: > BEGIN > select transactionid from pg_locks where pid=pg_backend_pid() and > locktype='transactionid'; > COMMIT > Każda transakcja zakłada lock na samą siebie, każde połączenie to jeden > proces, czyli w sumie jest to co chciałem.
ekhem: z dokumentacji: " When the pg_locks view is accessed, the internal lock manager data structures are momentarily locked, and a copy is made for the view to display. This ensures that the view produces a consistent set of results, while not blocking normal lock manager operations longer than necessary. Nonetheless there could be some impact on database performance if this view is frequently accessed."
czli z pg_locks'ów bym raczej tego nie czytał.
depesz
-- http://www.depesz.com/ - blog dla ciebie
Herakles - 13-01-2007 00:01
hubert depesz lubaczewski wrote:
> On 2007-01-11, Herakles <herakles@buziaczek.pl> wrote: >> BEGIN >> select transactionid from pg_locks where pid=pg_backend_pid() and >> locktype='transactionid'; >> COMMIT >> Każda transakcja zakłada lock na samą siebie, każde połączenie to jeden >> proces, czyli w sumie jest to co chciałem. > > ekhem: > z dokumentacji: > " When the pg_locks view is accessed, the internal lock manager data > structures are momentarily locked, and a copy is made for the view to > display. This ensures that the view produces a consistent set of results, > while not blocking normal lock manager operations longer than necessary. > Nonetheless there could be some impact on database performance if this > view is frequently accessed." > > czli z pg_locks'ów bym raczej tego nie czytał. > > depesz >
Faktycznie, dobrze że mi zwróciłeś na to uwagę, bo to bedzie dość sporo razy wywołane. Ale znalazłem w sieci eleganckie rozwiązanie dorobiłem żeby działało w 8.2 jakby ktoś potzrebował w starszych wersjach też zadziała;
get_transaction_id.c: #include "postgres.h" #include "access/xact.h"
PG_MODULE_MAGIC;
Datum get_transaction_id(PG_FUNCTION_ARGS) { TransactionId xid = GetCurrentTransactionId(); PG_RETURN_INT32((int32) xid); }
get_transaction_id.sql.in: CREATE FUNCTION get_transaction_id() RETURNS integer AS '$libdir/get_transaction_id.o' LANGUAGE 'c';
gcc -I/usr/local/pgsql/include/server -fPIC -shared -o get_transaction_id.o get_transaction_id.c
cp /usr/src/get_transaction_id/get_transaction_id.o /usr/local/pgsql/lib/get_transaction_id.o cp /usr/src/get_transaction_id/get_transaction_id.sql.in /usr/local/pgsql/share/contrib/get_transaction_id.sql.in
psql nazwa_bazy</usr/local/pgsql/share/contrib/get_transaction_id.sql.in
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
postgresql Select count(*) czy raczej Select count(ID)
[PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?=
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[PostgreSQL] Jak =?ISO-8859-2?Q?po=B3=B1czy=E6_funkcje_z_w?==?ISO-8859-2?Q?idokiem?=
Postgres - replikcja master-master
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
zanotowane.pldoc.pisz.plpdf.pisz.plnawschodzie.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|