Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-06-2008
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Manejo de transacciones

Buenas foro,

Alguien podria guiame en mi aventura

Tengo:
  1. Windows XP SP2
  2. Delphi 7.0
  3. MS SQL Server 2000

Estoy utilizando componentes ADO, todo bien, llego a visualizar una tabla que hice, la tengo dentro de un grid.
Asi mismo le he puesto unos botones:
Btn_StartTransaction--> form1.ADOConnection1.BeginTrans;
btn_Commit--> form1.ADOConnection1.CommitTrans;
btn_Rollback--> form1.ADOConnection1.RollbackTrans;
btn_Refresh--> form1.ADODataSet1.Refresh;
btn_Reopen--> form1.ADODataSet1.Close; form1.ADODataSet1.Open;

Ademas en el componete ADOConnection le he asignado lo siguiente a la propiedad: IsolationLevel=ilReadCommitted

Todo excelente, las acciones de los botones me funciona de maravilla..no hay quejas..

Casos de Uso:
1er caso.- (excelente, sin problemas)
La pc-01 abre el programa. (solo abre para mirar)
La pc-02 abre el programa. (solo abre para mirar)

2do caso.- (tengo problemas)
La pc-01 abre el programa. (presiona Btn_StartTransaction y añade un registro sin aun hacer un btn_Commit)
La pc-02 (Abre el programa pero no visualiza nada "no se ve el programa en ejecucion pero esta en memoria", pero cuando la PC-01 da un commit, inmediatamnete se visualiza la tabla en la PC-02).

Sospecho que mi programa quiere mostrar todos los registros confurmados con un commit y es por ello que la espera de la PC-02.

La idea es que en las PC's solo se visualice los registros que ya estan en commit.. que los cliente no esperen que los demas confirmen.. espero ser claro con mi requerimiento.

No se que estare haciendo nal. estoy seguro que me falta algo.. no puedo cometer el error de hace muchos años cuando decia: HUmm que mal. el Delphi no trabaja bien con base de datos extrañas a Borland...

Saludos cordiales

Your friend

StartKill
Lima-Perú
Responder Con Cita
  #2  
Antiguo 11-06-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Pues dependerá del momento en que hagas el "BeginTrans"... yo te recomendaría que lo hicieras en el botón que uses para guardar, es decir, hacer todo lo relacionado con la transacción en un solo evento.

Cuando el usuario quiera guardar la información, que le de click al botón "guardar" y entonces inicias la transacción y la controlas hasta hacer el "Commit" ( o "rollback").

Con eso evitas el problema de que el usuario inicie una transacción, luego vaya a prepararse su cafe, echar la plática con la secre y luego regresar a darle el "commit" (guardar).
__________________

Responder Con Cita
  #3  
Antiguo 11-06-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Cita:
Empezado por StartKill Ver Mensaje
Buenas foro,

Alguien podria guiame en mi aventura

Tengo:
  1. Windows XP SP2
  2. Delphi 7.0
  3. MS SQL Server 2000

Estoy utilizando componentes ADO, todo bien, llego a visualizar una tabla que hice, la tengo dentro de un grid.
Asi mismo le he puesto unos botones:
Btn_StartTransaction--> form1.ADOConnection1.BeginTrans;
btn_Commit--> form1.ADOConnection1.CommitTrans;
btn_Rollback--> form1.ADOConnection1.RollbackTrans;
btn_Refresh--> form1.ADODataSet1.Refresh;
btn_Reopen--> form1.ADODataSet1.Close; form1.ADODataSet1.Open;

Ademas en el componete ADOConnection le he asignado lo siguiente a la propiedad: IsolationLevel=ilReadCommitted

Todo excelente, las acciones de los botones me funciona de maravilla..no hay quejas..

Casos de Uso:
1er caso.- (excelente, sin problemas)
La pc-01 abre el programa. (solo abre para mirar)
La pc-02 abre el programa. (solo abre para mirar)

2do caso.- (tengo problemas)
La pc-01 abre el programa. (presiona Btn_StartTransaction y añade un registro sin aun hacer un btn_Commit)
La pc-02 (Abre el programa pero no visualiza nada "no se ve el programa en ejecucion pero esta en memoria", pero cuando la PC-01 da un commit, inmediatamnete se visualiza la tabla en la PC-02).

Sospecho que mi programa quiere mostrar todos los registros confurmados con un commit y es por ello que la espera de la PC-02.

La idea es que en las PC's solo se visualice los registros que ya estan en commit.. que los cliente no esperen que los demas confirmen.. espero ser claro con mi requerimiento.

No se que estare haciendo nal. estoy seguro que me falta algo.. no puedo cometer el error de hace muchos años cuando decia: HUmm que mal. el Delphi no trabaja bien con base de datos extrañas a Borland...

Saludos cordiales

Your friend

StartKill
Lima-Perú
Amigo, Sql server es un motor sumamente poderoso, y es de verdad un desperdicio manejar las transacciones en tus clientes.

Te recomiendo que utilices procedimientos almacenados de tal manera que solo en aquellos que ejecutan sentencias de inserción, modificación o borrado esten en bloques transaccionales. De esa manera tus aplicaciones Cliente servidor serán sumamente potentes y libres de los fallos que comentas.

Saludos.
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #4  
Antiguo 11-06-2008
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Gracias por su respuestas,...

La figura en general es la siguiente... (no utilizo temporales ni nada por el estilo) todo en las tablas.

Estoy manejando 3 tablas en forma simultanea:
1ra tabla cabecera de facturas
2da tabla detalle de facturas
3ra tabla saldo de clientes

Como es de suponer la 2da tabla tendrá mas de un registro y las otras dos tablas solo sera un registro por cada movimiento. (cada factura)

No se si es correcto, pero, yo en Firebird hago un startransaction (en la maquina cliente) cuando el usuario va hacer el ingreso de la factura, entonces, el usuario empieza a llenar la cabecera y le hace un post, luego empieza a llenar los registros (en una grilla) de venta en la tabla detalle y cuando el usuario termina su trabajo...tiene basicamente dos opciones grabar/commit ó Cancelar/Cancel.

Presiona grabar y se actualiza la tabla saldos, luego procede hacer el commit y si ocurre algun error el programa hace un Rollback, caso contrario termina de hacer el commit.

Retomando.. cuando un user esta haciendo la factura sin que haga el commit , y en ese momento entra otro usuario, se lee con total transparencia los datos de las tres tablas (es decir solo lee los registros que fueron commiteados) ni se detiene, ni se corta.. eso mismo deseo hacer con sql server 2000.

ContraVeneno >>mi duda es: si yo hago que en un boton-X esté begintransacction con el commit esto no me fucionaria, por que?, por que el cliente antes de presionar el boton-X, ya navegó por la grilla, insertando registros. navegando por los registros detalle, modificando, borrando...(ya se hizo commit solito, ni siquier le dije que haga begintransacion, creo que esta por defecto)

poliburro>>me indicas: que haga procedures.. debo suponer que se refieren hacer un procedure por cada accion: delete, insert, update.. pero me surguiria el mismo problema.. que tal si el user depues de haber hecho 10 items en los detalles se arrepiente?.. no puedo hacer un rollback..

A lo mejor estoy resolviendo el requerimiento de forma equivocada, se que no soy el primero que va cambiar de firebird para trabajar slqserver 2000.

Que me aconsejan señores

Saludos cordiales

Your friend

StartKill
Lima-Perú
Responder Con Cita
  #5  
Antiguo 12-06-2008
Avatar de nuk3zito
nuk3zito nuk3zito is offline
Miembro
 
Registrado: ago 2003
Ubicación: "Z" Land
Posts: 244
Poder: 21
nuk3zito Va por buen camino
StartKill,
La manera como trabaja Firebird es muy diferente a como trabaja SQL Server en cuestión de las transacciones, ya que firebird tiene la característica (buena o mala) de leer la última versión confirmada de los registros mientras que en SQL Server, si lo que intentas es leer un registro que está siendo bloqueado por una transacción... pues se esperará a que este registro sea liberado (con commit o rollback) para poder leerlo... o a menos que hagas una lectura sucia (usando with (nolock) por ejemplo ), pero eso ya son otras palabras, no siempre es conveniente hacer lecturas sucias.
En tu caso, que estás experimentando... pues el comportamiento que ves es normal y no cambiará, a menos que hagas una lectura sucia y cambies el isolation level a "ilREADUNCOMMITTED" o uses el query para leer como sigue:
Código SQL [-]
select * from tabla with (nolock) where...

Saludos y suerte con esas pruebas... así iniciamos todos, probando y preguntando.

__________________
Tiempo y ocasión acontecen a todos!
Responder Con Cita
  #6  
Antiguo 14-06-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Cita:
Empezado por StartKill Ver Mensaje

poliburro>>me indicas: que haga procedures.. debo suponer que se refieren hacer un procedure por cada accion: delete, insert, update.. pero me surguiria el mismo problema.. que tal si el user depues de haber hecho 10 items en los detalles se arrepiente?.. no puedo hacer un rollback..

A lo mejor estoy resolviendo el requerimiento de forma equivocada, se que no soy el primero que va cambiar de firebird para trabajar slqserver 2000.
Puedo asegurarte que si diseñas bien tus pantallas, considerando que usaras procedimientos almancenados nunca te va a suceder eso.

Llevo varios años trabajando con SPS y nunca me ha sucedido.

Saludos.
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #7  
Antiguo 14-06-2008
Avatar de nuk3zito
nuk3zito nuk3zito is offline
Miembro
 
Registrado: ago 2003
Ubicación: "Z" Land
Posts: 244
Poder: 21
nuk3zito Va por buen camino
Cita:
Empezado por poliburro Ver Mensaje
Puedo asegurarte que si diseñas bien tus pantallas, considerando que usaras procedimientos almancenados nunca te va a suceder eso.

Llevo varios años trabajando con SPS y nunca me ha sucedido.

Saludos.
Poliburro,
Viendo que tienes tanta experiencia ¿no sería bueno compartirla? para eso es el foro... no solo para discutir.

¿Podrías indicarnos más a fondo y darnos una pequeña guía de como es que trabajas?

Saludos.
__________________
Tiempo y ocasión acontecen a todos!
Responder Con Cita
  #8  
Antiguo 23-09-2008
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Hola poliburro,

Sin animos de presion, crees que seria posible que muestres un ejemplo de un matenimiento de una tabla (añade, modifica, elimina).. "con SP"

Que estos que no sean registro por registro, por ejemplo, en una grilla:
  1. Donde el user añada un conjunto de registros y luego recien de el famoso commit, ó a lp mejor el user se arrepiente y hace un rollback
  2. Donde el user elimine un conjunto de registros y luego recien de el famoso commit.

Te comento, que llegué a dar solución a mi requerimiento... pero--estoy trabajando con "begintranssaction" desde el cliente, y por lo que te entiendo deberia manejarlo todo con SP

A la espera de prontas "lineas de codigo"

Your friend

StartKill
Lima-Perú
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
manejo de arbol de contenidos y manejo se sonido y video Buelos Internet 4 09-07-2007 14:52:45
error en manejo de transacciones JODELSA Varios 1 11-07-2005 16:50:56
Como manejo varias Transacciones a la vez con Access marcoev Tablas planas 2 25-04-2005 21:44:28
Manejo de Transacciones takeo Conexión con bases de datos 0 01-12-2004 05:29:53
Manejo de Transacciones senpiterno Conexión con bases de datos 1 08-10-2004 15:05:34


La franja horaria es GMT +2. Ahora son las 15:21:30.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi