Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-07-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Select y Transacciones

Desde hace algun tiempo tengo esta duda:

¿ Se requieren transacciones para las consultas con "Select" ?

Porque cuando trabajo, generalmente defino en el data module sólo 2 transacciones una Read Commited y otra Read_Write Table Stability, entonces asigno la "Read Commited" para todas las querys (MDOQuery) con select (sin usar StartTransacction ni commit) y la segunda para todas las actualizaciones (Insert, Update y Delete), iniciando la transacción justo antes del execSQL y ejecutando el commit inmediatamente despues.

Lo que sí hago es usar algo así (en los Select):

Código Delphi [-]
Query.Open;
// leer Datos
// While eof
// lo que sea
Query.Close;
//Siempre cierro la consulta al terminar.


y en las actualizaciones:

Código Delphi [-]
// Preparar SQL  
///INSERT INTO...
// UPDATE ...
// DELETE FROM....
Try
   Transaction.StartTransacction;
   ExecSQL;
   Transaction.Commit;
Except
   on E: Exception do
         Begin
         Transaction.RollBack;
         ModalResult := mrNone;  // generalmente al pulsar Ok
         StatusMsg('Error al guardar datos');  // Status Bar
         Raise Exception.Create('Error al guardar los datos'+#13+
                                'Mensaje del servidor: '+#13+e.Message);
         End;
      End;


¿ debo iniciar y finalizar transacciones para los accesos de sólo lectura ?

D7 + FB2 + MDO

Gracias
__________________
Sitrico
Responder Con Cita
  #2  
Antiguo 02-07-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Como usas un Modo Read_Commited para las transacciones de solo lectura no necesitas abrirlas y cerrarlas, ya que esa transaccion vera las modificaciones confirmadas sin necesidad de abrirla y cerrarla.

Otra cosa seria que usases transacciones en modo snapshot table stability en las de lecturas, en ese caso tendrias que cerrarla y abrirla porque sino nunca veria las modificaciones de la base de datos realizadas posteriormente a su apertura.

Saludos
Responder Con Cita
  #3  
Antiguo 02-07-2007
reevil reevil is offline
Miembro
 
Registrado: abr 2006
Posts: 179
Poder: 19
reevil Va por buen camino
Las transacciones son metodo para garantizar la integridad de nuestos datos en caso de ocurrir alguna problema al momento de realizar alguna transformacion de los datos, cuando haces un select no puede decirse que transformas datos pues solamente se crea una vista de las tuplas pero estas quedan intactas, entonces no es necesaria la transaccion.

Si me equivoco por favor de correjirme lo antes posible por que tengo mucho que correjir entonces
Responder Con Cita
  #4  
Antiguo 02-07-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Cita:
Empezado por Mick
en ese caso tendrias que cerrarla y abrirla
Supongo que te refieres a la transacción (entiendo iniciarla y terminarla) porque los datos 99% de las veces abro, leo y cierro en un procedimiento (uso tablas temporales en memoria para trabajar tJvMemoryData)

Cita:
Empezado por reevil
Si me equivoco por favor de correjirme lo antes posible por que tengo mucho que correjir entonces
Yo también por eso la pregunta...
__________________
Sitrico
Responder Con Cita
  #5  
Antiguo 03-07-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Cita:
Empezado por reevil
Las transacciones son metodo para garantizar la integridad de nuestos datos en caso de ocurrir alguna problema al momento de realizar alguna transformacion de los datos, cuando haces un select no puede decirse que transformas datos pues solamente se crea una vista de las tuplas pero estas quedan intactas, entonces no es necesaria la transaccion.

Si me equivoco por favor de correjirme lo antes posible por que tengo mucho que correjir entonces
En interbase/firebird siempre se necesitan abrir una transaccion para lo que sea, si no hay transaccion no puedes leer datos. Las transacciones tambien afectan a la lectura de informacion, pudiendose leer registros distintos segun el tipo de transaccion que se utilice. Esto es debido a que el sistema de arquitectura multi-generacional de interbase es unico y la forma de guardar los registros y gestionar las transacciones es completamente diferente a cualquier otro sistema de base de datos. Por ejemplo en un cierto momento puede haber muchas versiones diferentes de un mismo registro guardadas en la base de datos.

Tipos de transacciones:

READ COMMITED ( RECORD VERSION )

Solo se ven los datos confirmados por otras transacciones, los datos que esten modificados por otras transacciones en curso no existen y se devuelve la ultima version confirmada de los datos.

READ COMMITED (NO RECORD VERSION)

Como la anterior solo se ven los datos confirmados por otras transacciones, pero si datos que es necesario leer han sido modificado por otras transaccions todavia no confirmadas, antes de leer estos datos, se espera a que esas otras transacciones se confirmen o cancelen, para tener asi los datos mas recientes posibles. Esto puede dar lugar a un interbloqueo y que la lectura falle por timeout en el caso de que otra transaccion que ha modificado datos que queremos leer, no finalice o tarde muchisimo en confirmarse o cancelarse. El tipo de transaccion anterior (RECORD VERSION) nunca tiene este problema ya que siempre devolvera los ultimos datos seguros aunque no necesariamente los mas recientes.

SNAPSHOT

Si leemos los datos con un transaccion tipo snapshot, no veremos ningun dato modificado posteriormente a la apertura de nuestra transaccion de lectura. Esto es como sacar una foto fija de la base de datos, tal cual estaba justo en el momento que se inicio la transacion, esto es util para generar informes y que estos sean coherentes, y no les afecten modificaciones de datos que se esten produciendo en el medio del calculo de los informes.

Como se puede ver segun el tipo de transaccion asociada a la lectura de informacion, los datos leidos pueden ser completamente diferentes.

Saludos

Última edición por Mick fecha: 03-07-2007 a las 10:37:16.
Responder Con Cita
  #6  
Antiguo 03-07-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Cita:
Empezado por sitrico
Supongo que te refieres a la transacción (entiendo iniciarla y terminarla) porque los datos 99% de las veces abro, leo y cierro en un procedimiento (uso tablas temporales en memoria para trabajar tJvMemoryData)
Si no mantienes transacciones abiertas, salvo en casos muy especiales o que se lean miles de registros que tarden muchos segundos o minutos en recibirse, poco afectara el tipo de transaccion para la lectura.

Ya que la lectura de datos se hace en unos pocos milisegundos de modo que los datos leidos seran los mismos en el 99% de los casos, sea una transaccion tipo snapshot o read commited.

Saludos
Responder Con Cita
  #7  
Antiguo 03-07-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Bueno Mick, Me queda poco claro lo que comentas de las transacciones, (hablemos de las transacciones de solo lectura) esto fue lo que te entendí:

Cita:
READ COMMITED ( RECORD VERSION )
las que yo uso.

Si hago varias consultas, en diferentes momentos, dentro de una misma transacción, se mostrarán los datos confirmados (con commit) actualizados

Cita:
READ COMMITED (NO RECORD VERSION)
Igual pero si hay modificaciones en curso espera por el commit de esas transacciones. (posibles errores de concurrencia, más cuidado al usarlas)

Cita:
SNAPSHOT
Tengo que terminar la transacción e iniciar una nueva para poder ver las actualizaciones de los datos. Esta requiere iniciar y cerrar las transacciones de lectura, no basta cerrar y abrir el dataset.
__________________
Sitrico
Responder Con Cita
  #8  
Antiguo 03-07-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Me he liado un poco al explicarlo por falta de tiempo al redactar las respuestas, pero lo has entendido y resumido perfectamente XD.

Saludos

Última edición por Mick fecha: 03-07-2007 a las 21:36:09.
Responder Con Cita
  #9  
Antiguo 04-07-2007
reevil reevil is offline
Miembro
 
Registrado: abr 2006
Posts: 179
Poder: 19
reevil Va por buen camino
yo practiicamente solo manejo mysql , pero me parecio muy interesante y util la forma en que firebird maneja las transacciones, muchas gracias por el dato
Responder Con Cita
Respuesta



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
Problema conuna consulta select...not in (select ...) VRO Firebird e Interbase 2 11-08-2005 08:56:35
5 select de 5 tablas diferentes en un select solo sakuragi SQL 6 15-06-2005 18:57:06
Select con Transacciones Ana Tudela Firebird e Interbase 1 08-04-2005 16:48:00
Select anidado: Select from (select....) Malon SQL 2 14-10-2004 14:01:24
Select anidado ( Select from select ) Malon Firebird e Interbase 1 05-10-2004 04:14:38


La franja horaria es GMT +2. Ahora son las 20:56:32.


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