[Python] psycopg, cursori e connessioni: tenere occupato un id

Manlio Perillo manlio.perillo a gmail.com
Lun 16 Maggio 2011 19:55:14 CEST


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Il 16/05/2011 19:37, Marco Fochesato ha scritto:
> [...]
> siamo di fronte ad un gestionale.
> L'utente x parte per compilare un DDT.
> L'applicazione "prenota" un id (chiave primaria) per il documento.

Non ci dici questa chiave primaria di che tipo è e che valori assume.

Inoltre, che intendi con "prenota"?

> L'utente y parte anche lui per compilare un DDT.
> L'applicazione "prenota" anche per lui un id, lo stesso di quello sopra
> (visto che non è ancora stato chiuso, e potrebbe anche darsi che x
> decida di non chiuderlo e annullare tutto.. (qui è il nocciolo)).
> Il primo che finisce e chiude il ddt, si prende il numero (commit).
> Per il secondo, verrà sollevata una eccezzione e verrà concesso un altro
> id (non mi interessa qui stabilire come).

Allora, *assumendo* che questo id sia essenzialmente un intero per cui
un DDT debba avere un id maggiore di quello precedente, la soluzione più
semplice che mi viene in mente è quella di utilizzare la serializzazione
del database:
http://www.postgresql.org/docs/9.0/interactive/transaction-iso.html#XACT-SERIALIZABLE


In pratica, puoi creare una tabella `ddt_id` dove memorizzare l'"ultimo"
ID utilizzato.

CREATE TABLE ddt_id (
    ddt_id INTEGER NOT NULL PRIMARY KEY;
);

Quindi, all'interno di una transazione serializzabile:
1) SELECT dell'ultimo ID inserito dalla tabella `ddt_id`
2) UPDATE sulla tabella `ddt_id` per incrementare l'ID
3) Usare l'ID incrementato nel DDT
4) COMMIT

A questo punto se un altra transazione ha cercato di fare l'UPDATE sulla
tabella `ddt_id`, riceverai un errore (solo il primo commit riuscirà).

Il tutto assolutamente non testato (e tra l'altro non ho mai fatto nulla
del genere).

Tra l'altro l'idea di avere una tabella che contiene una sola riga non
mi convince molto...


Ciao  Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk3RZQIACgkQscQJ24LbaUQOEgCfRxpA/EVuOpsWz5+E5d4KP7I2
z5UAmgOCbZA5VmResBd6uqOiJAEsNvTK
=bqjG
-----END PGP SIGNATURE-----


Maggiori informazioni sulla lista Python