Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2015-05

AYUDA, una pregunta sobre TSQLTransaction

4 messages · 4 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

SOCGER .-

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_procedurevar var_SQLTransaction : TSQLTransaction; var_SQLConnector : TSQLConnector; var_SQLQuery : TSQLQuery;beginend; sobre var_SQLQuery hago diferentes trabajos
primero una SELECTsi la select me devuelve que no existe algo creo con un INSERT ese algo inexistente si se llego a hacer este primer INSERTactualiz� con varios UPDATE varias tablas por ejemplo una tabla de STOCK y si se realizan todos los UPDATE considero que es el momento de actualizarvar_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

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150518/1ed801f3/attachment.html>

Reply by email

francisco prieto
to SOCGER .-

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�:

Show quoted text 73 lines
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.freepascal.org/pipermail/lazarus-es/attachments/20150518/f598ef02/attachment.html>

Reply by email

Ismael L. Donis Garcia
to SOCGER .-: Se que a estas alturas puede ser una pregunta tonta, pero he llegado a una DUDA que m�s…

Para mi entender estas tirando el trabajo del motor de datos por la borda. Precisamente est�s haciendo todo lo contrario a lo que debe ser y por tanto tienes que estar dispuesto a pagar las consecuencias.

Yo no te recomiendo que hagas nada de eso en Lazarus, para eso est�n los gestores de datos. La manipulaci�n de los datos debe realizarla si o si el servidor de datos, a no ser que sea una aplicaci�n monousuario que en ese caso si la puede hacer el cliente, y aun as� no lo recomiendo porque si vas a pasar la aplicaci�n a cliente servidor tendr�as que hacer todo de nuevo.

Para mi no te queda m�s que definir bien la base de datos a usar o caso contrario usar un Framework lo cual te evitar�a separar las capas lo cual te evitar�a estar pensando que motor de datos vas a utilizar.

Saludos
========
| ISMAEL |
========
Only for the small landowners and Cubans companies Website: www.sisconge.byethost15.com
www.sisconge.hol.es

Earlier message 79 lines
----- Original Message ----- From: SOCGER .- To: lazarus-es en lists.lazarus.freepascal.org Sent: Monday, May 18, 2015 5:34 AM Subject: [***SPAM*** Score/Req: 5.4/5.0] [Lazarus-es] AYUDA, una pregunta sobre TSQLTransaction 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 ------------------------------------------------------------------------------

Reply by email

Martin Gomez
to SOCGER .-: Se que a estas alturas puede ser una pregunta tonta, pero he llegado a una DUDA que m�s…

2015-05-18 6:34 GMT-03:00 SOCGER .- <socger en hotmail.com>:

Show quoted text 7 lines
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?

?Creo recordar que la l�gica de TODOS los motores SQL es que una transacci�n en la que haces un UPDATE antes de grabar se fija si su copia del registro cambi�, devolviendole el error al usuario (cada motor a su manera, supongo)

O sea, si A abre una transacci�n y est� por enviar un UPDATE, y en el interin B abre una transacci�n, env�a el UPDATE y hace el COMMIT, la transacci�n de A se marca como "dirty" y va a fallar a la hora del COMMIT.

?Una alternativa es usar SELECT (blablabla) FOR UPDATE, de esta manera los registros seleccionados se bloquean para el resto de las transacciones. Otra: en MySQL se pueden definir distintos niveles de aislamiento para las transacciones, creo que el que necesitas se llama "SERIALIZABLE" o "REPEATABLE READ". El manual en linea tiene toda la data sobre eso: http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html.

Tene presente que en MySQL hay varios motores de almacenamiento, MyISAM no soporta transacciones, InnoDB si.

Suerte con eso!

? Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program. ? ? *Linus Torvalds* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20150518/0db7247d/attachment-0001.html>

Reply by email