Publicidad

viernes, 14 de octubre de 2016

Forzar la Escritura de Base de Datos en Procesos Odoo

Forzar un Commit a la Base de Datos


    Muchos de nosotros en el ambiente de programación Odoo hemos notado una funcionalidad bastante interesante, poderosa y buena para evitar concurrencia de información basura en el Sistema y es la escritura a la Base de Datos mediante Odoo, durante la ejecución de una función (proceso) Odoo no realiza cambios en la Base de Datos hasta no terminar la ejecución correcta de la misma, si ocurre un error durante la ejecución Odoo hace un reverse a lo que se había realizado anteriormente, así evita que se guarde información basura o se llegaran a duplicar registros.
    Esto es muy útil, pero en ocasiones llegamos a tener la necesidad de forzar la escritura a la Base de Datos ya sea por el tamaño de recursos del Servidor (Memoria RAM), por bloqueos generados por el Servidor PostgreSQL (max_locks_per_transaction) o simplemente queremos que cierta información recabada no se pierda, por ejemplo en la lectura de archivos binarios de una ruta x, que al ser procesados son eliminados del servidor, en este proceso no podemos perder la información ya generada, así que podríamos forzar la escritura a la Base de Datos, otro ejemplo podria ser al generar reportes contables en donde la cantidad de información es en volúmenes considerablemente grandes y la memoria podria saturarse.

Para forzar la escritura de la Base de Datos basta con insertar este pequeño fragmente de codigo en la parte de nuestro código donde queremos forzar la escritura:

self.env.cr.commit()

6 comentarios:

  1. Hola German.
    En otros posts [0] [1] no recomiendan hacer commit de esta forma, aunque yo lo estoy probando y funciona bien.
    ¿Has tenido alguna vez algún problema haciendo este commit de esta forma que propones?
    Saludos.

    [0]: https://www.odoo.com/es_ES/forum/ayuda-1/question/what-is-the-cr-commit-risk-how-to-safe-db-write-60885
    [1]: https://doc.odoo.com/contribute/15_guidelines/coding_guidelines_framework/#never-commit-the-transaction

    ResponderBorrar
    Respuestas
    1. Hola Victor, puede generar error si durante tu flujo de trabajo pudieras grabar información a "medias" entonces pudieras duplicar cierta información de un registro, yo lo utilizo cuando proceso archivos de un directorio y al final mover el archivo a otra ubicación, aqui si no forzas la escritura y ocurre un error en un archivo x, los que ya fueron procesados, ya no se encuentran en el directorio original. Saludos

      Borrar
  2. gracias por el dato, si uso este comando se liberara la memoria?? o habrá algún comando para liberar la memoria?
    lo que sucede es que estoy cargando un archivo de 1000 registros el cual lo voy validando linea por linea, y y cuando llega a 400 se cancela el proceso por que se satura la de memoria

    de antemano gracias

    ResponderBorrar
    Respuestas
    1. En teoria deberia ser asi, si manejas en memoria binarios te ayuda muchisimo.

      Saludos

      Borrar