![]() |
Escritura simultanea en una tabla
Hola gente.
Como dice el título, tengo problemas al escribir en la misma tabla desde dos PCs distintas, pero los usuarios no me pudieron precisar si es a su vez sobre el mismo registro. Además, les sucede en un bajísimo porcentaje de veces. Tan bajo que en el lugar de desarrollo no he podido reproducir el error ninguna vez. El caso es el siguiente. Las aplicaciones de Insumos se registran en una tabla. De ésta, depende otra que almacena los productos y cantidades aplicadas. Cuando se guarda una aplicación, se recorre la segunda tabla para modificar el stock de insumos que está en una tercera tabla. De este modo, existe la posibilidad que desde dos puestos de trabajo se intente escribir en el mismo registro de stock. Mis preguntas en definitiva es: Existe alguna restricción o parámetro de los dataset o Firebird que no haya previsto? Es Firebird el encargado de controlar la recurrencia de datos o se debe controlar desde programa? Uso SQLConecttion, SQLDataSet, DataSetProvider, ClienteDataSet. No uso transacciones. Muchas gracias y si llegara a ser una tontera, sepan disculpar. |
Saludos.
No especificas como haces los UPDATE o INSERT de las tablas en cuestión. Pero una opción podría ser utilizar Stored Procedure y Trigger para agilizar estas operaciones. Otra opción no muy recomendada (según tengo entendido) es usar la sentencia With Lock o For Update. Extraído de Firebird V1.5 Release Notes: Cita:
|
Resp
Esto se conoce como el famoso abrazo mortal.
Y hasta tengo entendido esto solo puede pasar si el nivel de isalacion no incluyen el read version(configuracion de la transaccion). De lo contrario jamas deberia pasar esto. |
Este es el código que guarda en una de las tablas en cuestion. En la que yo supongo que pueden estar escribiendo simultaneamete en el mismo registro dos PCs.
Código:
CDInsumosAplicados.First; Si es necesario que diga cómo están parametrizado los controles que uso para acceder a los datos, me dicen. |
Resp
El problema no se basa en como ni con que aplicacion escribes los datos es de como este configurada el nivel de isolasion osea como se configure la tranasaccion.
Una configuracion que evita el abrazo mortal (dead lock) es: isc_tpb_read_committed isc_tpb_rec_version isc_tpb_nowait Lo de los bloqueos explicitos te lo soluciona perfecto pero si sabes con presicion lo que estas haciendo te va a causar mas dolores de cabeza que lo que te va a solucionar. |
La franja horaria es GMT +2. Ahora son las 05:50:21. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi