Re: [pgsql-es-ayuda] Transaccionaildad de una función postgresql en una excepción java

From: "Ivan Perales M(dot)" <ivan(dot)perales(at)gmail(dot)com>
To: Fernando Paz <fernandopaz(at)softwareevolutivo(dot)com(dot)ec>
Cc: Ayuda Esp PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] Transaccionaildad de una función postgresql en una excepción java
Date: 2013-03-20 22:06:08
Message-ID: CAHMuS04CUA75UYJv3Lk3SWV=FB6+ukcnbcosxD-UjqeWU2rFgg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

La otra que se me ocurre, es que estás llamando la funcion createQuery del
entity manager, y aunque el javadoc no dice si forma parte de la
transaccion o no (en caso de que hayas definido la transacción, lo que creo
que en tu caso si fue así), yo supongo que no lo forma (disculpa por decir
suposiciones, es que nunca he usado jpa solo hibernate y menos manejado
logica en el lado de la db), por el problema que dices que tienes y que
además puede ser cualquier query directo, tanto alteraciones en la misma bd
si se cuenta con los permisos necesarios como ejecuciones a funciones de
busqueda, inserción, etc. Entonces lo que debes hacer es decirle a la
conección que quieres ejecutar una función, ya que no hay un estandar de
sql para ésto y son especificas por cada db. Algo asi como:

CallableStatement cstm = conn.prepareCall("{call crearpersona(?)}");
cstm.setInt(1, persona.getId());
//cstm.addBatch();
cstm.executeBatch();

Espero te sirva, Saludos

2013/3/20 Fernando Paz <fernandopaz(at)softwareevolutivo(dot)com(dot)ec>

> Gracias por tu respuesta,
>
> Si he tenido que trasladar lógica de negocio a funciones pgsql debido a
> recorre muchas tablas y tiene muchas condiciones, hacer lo mismo desde java
> significaría una experiencia en performace muy diferente. Por eso elegimos
> crear estas funciones y dejar el motor de la bdd sea el encargado por ser
> el más óptimo.
>
> Sabes de alguna manera de evitar este problema?
>
> Gracias
>
>
> 2013/3/20 Ivan Perales M. <ivan(dot)perales(at)gmail(dot)com>
>
> Fernando, eso sucede por que la funcion crear persona crea su propia
>> transaccion y la comitea. Lo ideal seria que desde java crearas la persona
>> y solo hicieras el session.create(), si estas empezando a hacer lógica de
>> negocio en funciones de postgresql, entonces creo que algo en tu modelo
>> está fallando.
>>
>> Saludos
>>
>>
>> 2013/3/20 Fernando Paz <fpaz(at)engineer(dot)com>
>>
>>> Holas,
>>> Me hallo en un problema, tengo una servicio escrito en java que utiliza
>>> DAOs (JPA) para hacer inserción de datos en la bdd postgresql
>>> Mi código es: en la primera parte del código hago un create de una
>>> pesona, en una segunda parte llamo a una función de postgresql y finalmente
>>> en una tercera parte hago un update del registro:
>>>
>>> // primera parte
>>> ...
>>> personaDao.create(persona);
>>> ...
>>> // segunda parte
>>> ...
>>> usuarioDao.createQuery("select crearpersona (" + persona.getId() +
>>> ")"); // llamada a funcion postgresq
>>> ...
>>> // tercera parte
>>> ...
>>> registroDao.update(registro); // AQUI FALLA!!!!!
>>> ...
>>>
>>> El porque falla no es el problema, el problema fue la transaccionalidad
>>> ya que al dispararse la excepción de java hizo rollback de la primera y
>>> tercera parte, pero la funcion de postgres que internamiente tiene su begin
>>> y end ya hizo commit de sus oporaciones internas.... la consecuencia esa
>>> que mi bdd quedo partida
>>>
>>> No se como afrontar este tema de transaccionalidad de la función
>>> asociada a la conexión que disparó su ejecución y que haga el rollback del
>>> caso
>>>
>>> Su ayuda por favor que me falta o hago mal
>>>
>>> Gracias
>>>
>>
>>
>>
>> --
>> Lindolfo Iván Perales Mancinas
>> Solo existen 10 tipos de personas en el mundo, las que saben binario y
>> las que no.
>>
>
>
>
> --
>
> *FERNANDO PAZ MAZON| Specialist Software Development*
> Fco Salazar E10-37 & Tamayo st, Atlantic Business Center Bldg, suite 501 |
> Quito - Ecuador- Southamerica | *fernandopaz(at)softwareevolutivo(dot)com(dot)ec*<fernandopaz(at)softwareevolutivo(dot)com(dot)ec>| (593) 2-6041-340 | ( 593) 99-621-3050|
> *WE LOVE trees, Prints only if you do NEED, THANKS*
>
> <http://ec.linkedin.com/in/pazfernando>
>

--
Lindolfo Iván Perales Mancinas
Solo existen 10 tipos de personas en el mundo, las que saben binario y las
que no.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Conrado Blasetti 2013-03-21 11:11:00 Recuperar select ejecutado
Previous Message Martín Marqués 2013-03-20 20:41:52 Re: Buen dia