pablo ha scritto:
Utilizzare il cursore "stock" è molto rischioso perché chiudi una transazione che poteva avere delle scritture che avvengono dopo il tuo metodo e quindi lasci il db in uno stato inconsistente, dovresti essere 100% sicuro che nulla avviene dopo il tuo metodo, e con un ERP è molto complicato saperlo viste le tante strutture coinvolte.
ho scritto una mezza cavolata, nel senso che si, è rischioso fare commit sul cursore che ti ritrovi nell'oggetto; in parte molti si sono salvati perché poi dopo tutto è finito bene (e non ci sono stati rollback).
Questo perché di base il cursore "di Odoo" non è
autocommittante e quindi quando si fa un commit, i dati vengono scritti, ma la transazione rimane aperta. Le successive scritture vanno a buon fine ma se poi viene fatto un rollback, vengono cestinate tutte le scritture che erano in pending dall'ultimo commit in poi, quindi quelle prima sono ormai memorizzate sul DB.
Esempio:
Il client fa una chiamata RPC verso il metodo
pippodef pippo(self):
create_1
create_2
create_3
cr.commit()
write_1
write_2
// errore
cr.rollback()
cr.close()
quando l'esecuzione del codice raggiunge il cr.rollback(), le due write (write_1, write_2) non vengono applicate sul database, ma la rollback si ferma li, poiché tutto ciò che è stato fatto prima del cr.commit() (create_1,create_2,create_3) ormai è permanente.
Il database quindi è in uno stato inconsistente
La soluzione corretta è quella del post sopra.