Re: PostgreSQL 7.4.1: Transaktionsproblem

From: Denkewitz Lars <lars(dot)denkewitz(at)dogro(dot)de>
To: 'Andreas Seltenreich' <andreas+pg(at)gate450(dot)dyndns(dot)org>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: PostgreSQL 7.4.1: Transaktionsproblem
Date: 2005-08-11 15:52:08
Message-ID: 527CFCD935ABD711A86E0003473A917E077C20@SpiritII
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Hallo,

vielen Dank für das Interesse. Ich habe es eben mit der Version 8.0.3 unter
Windows (Server & Client) probiert:
Hier das ESQL-Programm, wobei ich anmerken möchte, dass es für uns wichtig
ist, dass der Cursor bei einem Rollback nicht geschlossen wird, es soll
eigentlich genauso so funktionieren wie in dem Beispiel.

//==========================================================================
=========
#include <stdio.h>
#include <stdlib.h>

EXEC SQL include sqlca;

int main (int argc, char* argv[])
{
EXEC SQL begin declare section;
char PSQL_connect[100]="ases";
int ID;
int nummer;
long lerror;

EXEC SQL end declare section;

EXEC SQL CONNECT TO mbund(at)localhost AS :PSQL_connect USER postgres;
EXEC SQL AT :PSQL_connect SET AUTOCOMMIT TO ON;

EXEC SQL at :PSQL_connect DECLARE c_testdb CURSOR WITH HOLD FOR
SELECT nummer_id,nummer from test2db where nummer_id > 0
order by nummer_id;
EXEC SQL OPEN c_testdb;
lerror = sqlca.sqlcode;
fprintf(stderr,"lerror open %d\n",lerror);
fprintf(stderr,"sqlerrmc: %s\n",sqlca.sqlerrm.sqlerrmc);
if (lerror == 0) {
EXEC SQL AT :PSQL_connect fetch c_testdb into :ID,:nummer;
lerror = sqlca.sqlcode;
fprintf(stderr,"lerror fetch %d\n",lerror);
while (lerror == 0) {
nummer *= (-1);
fprintf(stderr,"ID: %d\n",ID);
EXEC SQL BEGIN;

EXEC SQL AT :PSQL_connect update test2db set nummer
= :nummer where nummer_id = :ID;
lerror = sqlca.sqlcode;
fprintf(stderr,"update sqlcode:
%ld\n",sqlca.sqlcode);

if ((ID == 3) || (ID == 6)) {
EXEC SQL ROLLBACK;
} else {
EXEC SQL COMMIT;
}
EXEC SQL AT :PSQL_connect fetch c_testdb into
:ID,:nummer;
lerror = sqlca.sqlcode;
fprintf(stderr,"fetch sqlcode:
%ld\n",sqlca.sqlcode);
}
}
EXEC SQL AT :PSQL_connect close c_testdb;
EXEC SQL DISCONNECT :PSQL_connect;
}
//==========================================================================
=================

Die Tabelle test2db sieht vor dem Lauf des Programms so aus:

nummer_id nummer
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9

Anschließend so:

nummer_id nummer
1 -1
2 -2
3 3
4 -4
5 -5
6 6
7 -7
8 -8
9 -9

D.h. dass bei den Nummern 3 und 6 zunächst der Satz geupdatet wurde, dass
Rollback gezogen und anschließend mit dem WITH HOLD Cursor weitergefetcht
werden konnte.

Gruß Lars

-----Ursprüngliche Nachricht-----
Von: Andreas Seltenreich [mailto:andreas+pg(at)gate450(dot)dyndns(dot)org]
Gesendet: Donnerstag, 11. August 2005 17:20
An: Denkewitz Lars
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Betreff: Re: PostgreSQL 7.4.1: Transaktionsproblem

Denkewitz Lars schrob:

> In einem kleinen Beispiel bleibt der Cursor nach einem Rollback auch
offen,
> d.h. dann wohl so in der Art, dass ich da quasi Glück habe? Es gilt dann
so
> in etwa die Aussage: Du kannst dich drauf verlassen, dass der Cursor offen
> bleibt bei einem Commit, alles andere ist unbestimmt, der Cursor kann bei
> einem Rollback offen bleiben oder auch nicht?

Hmm, ich hab's nicht geschafft, hier mit 7.4.7 einen holdable cursor
zu produzieren, der nach einem rollback noch offen ist. Könntest Du
Dein Beispiel an die Liste schicken?

> Das Schlimme ist doch jetzt eigentlich, dass PostgreSQL bei Cursern mit
> Rollback kein definiertes Verhalten zeigt, der Standard sagt wenigstens:
die
> Cursor werden geschlossen! Oracle und Informix lassen die Cursor offen!
Bei
> PostgreSQL weiß man es nicht!?

Also wenn Du mit einer aktuellen Version ein Beispiel konstruieren
kannst, bei dem Postgres vom Standard abweicht, wäre das auf der
pgsql-bugs-Liste bestimmt ganz willkommen.

Gruß
Andreas

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Andreas Seltenreich 2005-08-11 17:23:20 Re: PostgreSQL 7.4.1: Transaktionsproblem
Previous Message Andreas Seltenreich 2005-08-11 15:19:58 Re: PostgreSQL 7.4.1: Transaktionsproblem