[Lazarus-es] AYUDA, una pregunta sobre TSQLTransaction

francisco prieto fajprieto en gmail.com
Lun Mayo 18 13:51:58 CEST 2015


Pero estas comparando 2 formas de trabajos distintas... incluso en
SQLServer si dos maquinas acceden de esa forma sus transacciones son
independientes en todo momento.
De modo que no me extrañaría que todos los motores sigan la misma lógica.
Por otra parte SqlServer tiene mas tipos de transacciones no solo el Commit
para trabajar, así que creo que la comparación no es posible.
Hay algunos procesos que siempre deberían ser hechos desde el propio motor
no importando el motor... Cuales son esa cosas, simple, aquellos procesos
que pueden derivar en abrazos mortales.
Esa es mi humilde opinión.

Saludos,

Pancho
Córdoba
Argentina

El lun., 18 may. 2015 a las 6:34, SOCGER .- (<socger en hotmail.com>) escribió:

> Se que a estas alturas puede ser una pregunta tonta, pero he llegado a una
> DUDA que más abajo detallo y necesitaría saber si es correcta, ¡por favor!
>
> Estoy trabajando con MySQL y los componentes sqldb propios de lazarus.
>
> Tengo los siguientes componentes creados en una procedure :
>
> procedure nombre_procedure
> var var_SQLTransaction : TSQLTransaction;
>        var_SQLConnector   : TSQLConnector;
>        var_SQLQuery       : TSQLQuery;
> begin
> end;
>
> sobre var_SQLQuery hago diferentes trabajos
>
> primero una SELECT
> si la select me devuelve que no existe algo creo con un INSERT ese algo
> inexistente
>
> si se llego a hacer este primer INSERT
> actualizó con varios UPDATE varias tablas por ejemplo una tabla de STOCK
>
> y si se realizan todos los UPDATE considero que es el momento de actualizar
> var_SQLTransaction.Commit;
>
> pero si en el momento de hacer todos los anteriores pasos se produce un
> error o considero que no se debe de actualizar nada pues tiro marcha atras
> con
> var_SQLTransaction.Rollback;
>
>
> Bueno pues ahora es el momento de presentar la DUDA:
>
> Imaginemos que antes de hacer el commit alguien hace el mismo proceso y me
> actualiza el mismo registro de la tabla STOCK, es decir que la máquina A
> está haciendo esta procedure y está actualizando el stock del artículo X y
> sin hacer el commit la máquina A, una máquina B hace el mismo proceso sobre
> el mismo artículo X y actualiza el STOCK antes que la máquina A.
>
> Ahora viene la pregunta del millón:
> ¿Una Transacion abierta obliga al servidor a esperar a la máquina B hasta
> que no termina la transacción de la máquina A?
> O lo que es lo mismo, como la máquina A tiene una transacción que todavía
> no ha hecho un COMMIT, tiene prioridad sobre el resto de máquinas y las
> demás no hacen hada hasta que esta transacción está terminada?
>
> A ver, que lo que necesitaría es saber si trabajando de esta manera voy a
> tener problemas de concurrencia sobre un mismo registro a la hora de
> actualizarse.
>
> Hasta ahora he estado trabajando en SQLserver con procedimientos
> almacenados y funciones. Con ellos no he tenido problemas porque en
> SQLserver cuando se ejecuta un procedimiento, o una función, se ejecuta
> hasta el final sin permitir concurrencia.
>
> Pero he decidido por futuras políticas de migración de base de datos no
> usar procedimientos ni funciones almacenadas en mysql, sino que
> directamente hacerlo todo desde lazarus. Por este motivo es que tengo esta
> grave duda a la que os agradecería de corazón una respuesta lo más sencilla
> y encaminada posible.
>
> De antemano os agradezco de todo corazón vuestra cooperación y ayuda.
> También sirva estas líneas para agradecer vuestro apoyo a esta lista.
>
> Saludos
>
>
>  _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20150518/f598ef02/attachment-0002.html>


More information about the Lazarus-es mailing list