Ayuda - La transacción a sido deshechada


([N4] Ramon Denuc) #1

Hola Foro,

Estoy intentando eliminar casi dos millones de registros de una tabla que contiene solo registros de control del programa, que ahora mismo no tiene ninguna utilidad, y cuando el programa lleva unos 15 minutos me sale una ventana indicándome que la “Transacción de Eliminar ha sido Deshecha” -> ¿ Reintentar ? y a partir de hay, parece que todo se quede bloqueado, digo parece, porque si intento cerrar todo, al final el vAdmin me indica que hay transacciones en curso.

En fin no se si es que se ha ido todo al traste, o es que se queda bloqueado o lo parece, ¿Alguna idea?

Todo el proceso de eliminar dicha tabla es ejecutada en local, porque excepcionalmente a este cliente se le tiene instalado todo en local.

Os adjunto un par de imagen, y en la que aparece la ventana del vAdmin, hay un mensaje que aparece de que “No se ha podido conectar al servidor vatp://127.0.0.1”

Saludos




([N2] Mgalvezh) #2

Divide y vencerás, crea un proceso que no transaccione y que vaya llamando al que borra, pero con una cantidad x de registros, que no pase la transacción de cierto tiempo, así te funcionará, por supuesto el proceso de borrado en 3P.

Saludos.
Miguel.


([N4] Infortic) #3

Cuando se ejecuta en 3er plano, si no hay comunicación entre el cliente y el server durante 15 minutos la transacción se cae, es así de simpático velneo. Además si la transacción alcanza determinado nº de escrituras en disco, también se cae (suele ser alrededor del millón).

Para evitar la caída por timeout de comunicaciones hay que ejecutar de vez en cuando el método js clientEntertainer() de la clase vRoot, de modo que el cliente sepa que tiene comunicación con el server, pero en tu caso, si no se te cae por tiempo se te caerá por cantidad de escrituras.

Como te dice Miguel trocea la transacción y hazlas más pequeñas para no tener problemas.


([N4] Ramon Denuc) #4

Hola Foro,

Esta claro que la eliminación se tiene que hacer en 3P, para intentar mejores resultados.

¿Que me aconsejáis para hacer selecciones de cantidades de registros?

He de reconocer que no tengo mucha experiencia en hacer procesos en 3P,

¿Sabéis de alguna OpenApps, de ejemplo para aprender correctamente la forma de hacer procesos en 3P?

Saludos


([N4] Infortic) #5

No es tema de 1er o 3er plano, sino de cómo transaccionar.

Tienes que hacer 2 procesos:

  • Uno de ellos trocea la lista en bloques de 10000 registros o 100000 lo que veas que no pase de 10 minutos, llamando a un segundo proceso que borra el trozo de lista. Este proceso, no debe de hacer ninguna escritura en disco, para que no se inicie transacción.

  • El segundo proceso borra los registros que le entran por su entrada, este proceso creará una transacción individual, por lo que si has creado 3 trozos en el primero tendrás tres transacciones cada una durará menos de 10 minutos y tendrá menos de un millón de operaciones.

El primer proceso lo ejecutas en 3p y ya está.

Para trocear tienes varias formas:

  1. Ir metiendo en una cesta hasta la cantidad de registros requerida y luego mandas al proceso de borrado los registros de la cesta.
  2. Usar la función “Cortar lista” para coger sólo los primeros registros de la lista.

([N1] wikan) #6

En la Open App de control de versiones, tienes un procesos que se llama VERSIONS_LIMPIAR_LOTES_3P. Te sirve de ejemplo perfecto para esto. Elimina por lotes, usando un proceso en 3P, además de mostrar el proceso en la barra de tareas.


([N4] Ramon Denuc) #7

Hola Foro,

Gracias Manuel por la ayuda ofrecida, ya implementado tus sugerencias y he conseguido eliminar los casi dos millones de registros.

Pero me ha dado por mirar si el volumen del archivo .DAT también se había desinflado, pero mi sorpresa a sido que continua siendo igual de grande que antes de eliminar los registros.

¿Debo hacer alguna cosa más?

Saludos


([N1] wikan) #8

Se mantiene el tamaño por que dentro de han quedado los huecos que serán re-usados por los nuevos registros que introduzcas a partir de ahora. Es el funcionamiento normal de Velneo.

Si acaso, podrías regenerar el area de datos de dicha tabla que creo que si la compacta.


([N4] Ramon Denuc) #9

Hola Manuel,

He regenerado el área de datos, y el volumen de la tabla continua igual, y la verdad, no lo encuentro correcto que la tabla que ahora esta vacía continué con un volumen de unos 400Mb sabiendo que dentro no hay ningún registro.

Si estuviera dicha tabla en cloud, no encontraría correcto que se ocupe dicho espacio por algo que no existe.

De todos modos, y alguno de vosotros tiene alguna otra idea de como rebajar el volumen, se lo agradecería.

Saludos,


([N4] rpaton) #10

Hola:
Crea en esa tabla y campo nuevo con tamaño 1. Al reiniciar la solucion se reconstruye la tabla por cambio de estructura y desaparecen los huecos. Asi me lo indicaron en soporte. El tamaño se adapta a los registros que hayan quedado.

Pero claro no es en ejecucion.

Saludos

Ricardo Paton


([N1] wikan) #11

Ramón tampoco te creas, el tamaño de registro de Velneo no es dinámico, aunque un campo esté vacío ocupa espacio.
Imagina que tienes 500k registros y borras, el fichero deja ese espacio para ser reusado, imagina que tuviera que compactar con cada borrado, el rendimiento sería pésimo.

Si es cierto que debería haber una instrucción de compactación tanto para estos casos como para las tablas de objectos.


([N4] Ramon Denuc) #12

Hola,

Manuel entiendo perfectamente tu ultimo comentario, pero continuo pensando que se debería poder compactar con el espacio real y no el usado anteriormente, y más, cuando hablamos de grandes cantidades de espacio, que no siempre es barato.

Saludos


([N1] wikan) #13

Técnicamente es que no se borran, se quedan vacíos y no se indexan, Velneo lo sabe y reutiliza esos espacios para las nuevas altas, de ahí que la tabla siga manteniendo su tamaño físico en disco.


([N1] vgegeo) #14

Generando el area de datos, y despues reindexando, ¿tampoco se reduce?

El fichero de indices si, ¿pero la tabla no?


([N4] Ramon Denuc) #15

Hola Gegeo,

Efectivamente al generar el área de datos y después reindexando la tabla, el fichero Indice se reduce pero la tabla se queda igual.

Saludos