Entendí tu pregunta.
Creo que no me entendiste la respuesta.
Postgresql no es como Oracle ( Oracle soporta basicamente dos tipos de
modos transaccionales ), postgresql 4 ( de lo que recuerdo ).
En los links que te envie. una persona tiene un problema similar al que
tu tienes.
Puedes revisar lo que envie por favor.
http://dba.stackexchange.com/questions/62024/how-to-set-isolation-to-serializable-deferrable-for-a-whole-postgresql-database
revisa si tienes esta opcion por favor.
transaction_deferrable = on.
Lo pregunto por que me tinca que alguien cambio algunas cosas para que
la base de datos sea más rápida ( pero eso te genera otro otros
problemas de consistencia ).
Ahora si estas usando pool, revisa que estes realmente conectado al
master y no al esclavo, ( de hecho yo probaría con el esclavo abajo ).
Algo esta mostrando datos sucios ( dirty read ).
Lo otro que puede estar afectando es que un componente este conectado al
pool y el otro a la base de datos de forma directa, ( imagino que el
pool tiene algun delay para tener velocidad ) pero esto es pura conjetura.
On 19/05/2016 10:16 PM, Ruben Fitó wrote:
jajajaj, como siempre me explico fatal.
Expongo un mini esquema del pipeline:
*BACKEND WEB (JAVA-JDBC)
* *Aplicación en C* *Anotaciones*
Tiene varias conexiones permanentes
Inicia un bloque transaccional con BEGIN
Inicia una petición SOAP
Inicia proceso de la petición del backend
Abre una nueva conexión con la base de datos Libreia libpq
Hace un INSERT sin (BEGIN). Pqexec() + Pqclear() Hemos
comprobado que
la fila se inserta. Por lo tanto el autocommit hace su función. Lo que
no sabemos es si es instantáneo.
La base de datos le devuelve el valor del ID de la fila. El ID
es un
serial.
Cierra la conexión con la base de datos.
Devuelve el ID al backend
Con el ID hace una busqueda en la misma tabla
Postgres responde que no encuentra la fila
Si incluimos un sleep(1) antes de ejecutar la query
SI que la encuentra. Vaya añadimos un lag de un segundo.
Como pueden ver son conexiones diferentes, bloques transaccionales
diferentes, programas diferentes.
Por lo tanto cuando el backend hace la consulta debería encontrar la fila.
Hemos intentado simular este mismo pipeline manualmente desde
psql/scripts y no hemos podido reproducir esta situación.
Podría incluir que el backend hace un rollback si NO encuentra la fila y
un commit si la encuentra, pero creo que esto es irrelevante para este caso.
Espero se entienda. jejeje
Un fuerte saludo
2016-05-19 10:35 GMT+02:00 Eduardo Morras <emorr...@yahoo.es
<mailto:emorr...@yahoo.es>>:
Resumiendo si lo he entendido bien:
Transaccion A
BEGIN
BEGIN
INSERT
AUTOCOMMIT
BEGIN
INSERT
AUTOCOMMIT
BEGIN
INSERT
AUTOCOMMIT
....
No hay COMMIT para el BEGIN inicial
Al hacer un SELECT no puedes leer los datos guardados ya que no han
sido realmente guardados.
Que es lo que quieres hacer? Que permanezcan los datos en la BD? Haz
el COMMIT final. Que no permanezca pero poder consultarlos? Define
la tabla para que pueda ser leida por readers y haz un ROLLBACK al
final, si no son muchos datos es mas rapido que crear una tabla
temporal y hacerle un drop posterior.
--
*Ruben Fitó *
Software Engineer
Ubiquat Technologies, SL
r.f...@ubiquat.com <mailto:j.catari...@ubiquat.com>
www.ubiquat.com <http://www.ubiquat.com/>
Tota la informació continguda en aquest document i arxius adjunts és
CONFIDENCIAL protegida per llei de secret comercial. Si l'ha rebut per
error, si us plau elimini'l i posi's en contacte amb l'emissor.
All information contained in this document and any attachments are
CONFIDENTIAL and protected under trade secret laws. If you receive this
message by mistake, please delete it and notify it immediately to the
sender.
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda