FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Duda sobre grabación de registros
Buenas a todos,
Tengo el siguiente problema en una base de datos y que trabaja con datos reales y me tiene muy mosca, a ver si podéis echarme un cable. Tengo una aplicacion hecha en Delphi 10 Seatle y que trabaja en red local con firebird, utilizo alrededor de 20 tablas. El problema viene que de vez en cuando y no siempre, algún usuario introduce unos datos y no se refleja de inmediato en la base de datos, se quedan en el limbo, y se llega a actualizar cuando cierro el servidor ó la aplicación cliente (se me olvidaba comentar que la aplicación es DATASNAP). He revisado uno de los procedimiento que me ha fallado y tiene puesto su correspondiente transacciones.StartTransaction, Transacciones.commit ó si procede transacciones.rollback. Tengo una conexion creada y asociado a esa conexión tengo un componente TFDTransaction, del cual tiro para realizar las transacciones en cada escritura que se realiza a la base de datos. ¿que puede estar pasando?, ¿como hago para que no se queden datos colgados y se graben directamente sin esperar un segundo, existe alguna instruccion? Me estoy deprimiendo.... Gracias a todos. |
#2
|
||||
|
||||
Crea una prueba aislada del problema, colocando en una nueva aplicación los elementos esenciales del proceso, como son los componentes de acceso y conexión de base de datos. Un simple formulario, con un botón para intentar reproducir el problema.
Es normal abrumarse ante un bug misterioso cuando este ocurre a mitad del bosque. Pero es un poco más fácil encontrar la causa si se recorta ese pequeño trozo de bosque y se planta en la maceta de tu ventana. ¡Y nos muestras el código! Saludos. |
#3
|
||||
|
||||
Un commit que falta por ahí, también
|
#4
|
|||
|
|||
Gracias por las respuestas, me he limitado a ejecutar un proceso sencillo y he hecho paso a paso lo siguiente y algo falla, me explico:
1º Ejecuto el servidor en modo depuración. Es decir paso a paso. Tengo un stop puesto en la instrucción EXECSQL. 2º Ejecuto el Cliente en modo normal. 3º Ejecuto el SQLManager Lite para ver en todo momento los valores que toman los campos de un registro. 4º Modifico un registro en el cliente y pulso aceptar para que mande los datos al servidor con la correspondiente funcion.enviarDatos(dato1, dato2, dato3...); 5º En el servidor se ejecuta el proceso que he copiado mas arriba y se para la linea donde tengo el stop, y empiezo a ejecutar paso a paso. 6º Se ejecuta QExpedientes.ExecSQL y me voy a la base de datos y no observo modificación alguna, es de esperar que sea así, puesto que no ha llegado aún al commit. 7º Cuando se ejecuta la línea "transacciones.Commit", me voy de nuevo a la base de datos (SQLManager Lite) y le doy a refrescar para ver si ha cogido los nuevos datos y no los ha cogido, aún tiene los antiguos. Le doy a refrescar varias veces y nada de nada. Incluso ejecuto otro cliente y aparecen los datos antiguos. Deprimente. 8º Cierro la aplicación y ahora sí, estan los datos en la Base de Datos. El problema que me encuentro es que en el momento que grabo un registro, no se actualiza la base de datos de inmediato, dando origen a un problema, que es que otro ususario se conecte y le lleguen unos datos que no sean los actualizados. De hecho me ha pasado ya y quiero evitar ese problema con la grabación inmediata de datos del cliente al servidor. No sé que hago mal, en principio el proceso es muy sencillo, tal como he puesto más arriba. Supongo que será tocar alguna propiedad o algo del componente TFDTRansaction. Espero me echen un cable. Gracias anticipadas. |
#5
|
||||
|
||||
Hola
No conozco los componentes que usas pero podrias fijarte el nivel de aislamiento de las transaccion con un readcommited ya deberia leer los datos cambiados. Espero sea util Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar. Antonio Machado |
#6
|
|||
|
|||
Cita:
Gracias por tu respuesta. El componente TFDFTransaction en su propiedad Isolation tiene asignado "xiReadCommited". El TFDQuery que utilizo para realizar el "Update from ...." tiene en su propiedad Transaction asignado el componente TFDFTransaction. En principio no veo nada raro. Para que me funcione tengo que poner las siguienes instrucciones en el cliente:
No me parece muy coherente cada vez que modifique un dato conectar y desconectar el cliente para que actualice la base de datos. A ver si podemos arreglarlo de otra forma. Gracias. |
#7
|
||||
|
||||
Haz lo que te dijo Al González:
Cita:
|
#8
|
||||
|
||||
Cita:
cuando una transaccion esta en proceso y no termina con su respectivo commit, al cerrar la connecion , en tu caso cerrar el cliente o servidor, firebird toma el commit en ese momento, (autocommint), es por eso que solo ves los datos hasta que cierran la app cliente o server. en resumen tienes que confirmar los datos con un commit, revisa esto, las querys que estas utilizando para hacer insert o update, deben tener asiganada la transanccion que tiene la base de datos, la base de datos tienen que tener asignada esa misma transaccion.
__________________
all your base are belong to us |
#9
|
|||
|
|||
Cita:
He revisado todas las transacciones y todas terminan con un Commit o con un RollBack. No hay ningún StartTransaction que se quede descolgado. Además me he ido a un proceso de alta de registro en concreto que se ve facilmente en 3 líneas el proceso completo de StartTransaction y el commit seguidamente y no graba al instante en la base de datos. No sé ya que propiedad tocar ni que hacer. Quedo a la espera de vuestros comentarios. Gracias. |
#10
|
|||
|
|||
¿Existirá alguna instrucción para vaciar el buffer o algo parecido?
Recuerdo que en las tablas de delphi mas antiguos existía el "flushbuffer" para grabar inmediatamente, no sé por si acaso hay algo parecido. Gracias. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Grabacion | macrossman | Varios | 2 | 06-04-2011 22:09:07 |
Duda registros valor 0 sql | drykea | SQL | 6 | 13-03-2008 17:43:52 |
Duda sobre DFS | enrique_84 | Varios | 2 | 08-06-2006 11:53:40 |
grabación | jorodgar | Windows | 4 | 19-09-2005 11:22:42 |
Duda sobre busqueda de registros... | hademon | Varios | 2 | 16-09-2005 19:26:17 |
|