Ver Mensaje Individual
  #2  
Antiguo 22-12-2004
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Reputación: 22
Mick Va por buen camino
Cada transaccion define un conjunto de modificaciones sobre la base de datos que deben hacerse de forma atomica, eso significa que o se hacen todas o no se hace ninguna.
Esto permite mantener la coherencia en la base de datos aunque se produzca algun error en el medio de las transacciones, o algun conflicto con otro cliente/usuario.
Asi que la cuestion no es ni tener una unica transaccion para todo ni una transaccion por cada query, sino que cada proceso hay que estudiarlo y definir una o mas transacciones segun sea necesario:
Por ejemplo si tenemos un proceso de salida de articulos en el que realizamos lo siguiente:
1. Creamos un albaran de salida de articulos, guardando en una tabla de detalles la lista de articulos y cantidades que salen del almacen.
2. Actualizamos la tabla de stocks o de articulos restando las cantidades de cada articulo que han salido.

En este proceso de ejemplo vemos que si por algun problema, se realiza el punto 1 del proceso, pero el punto 2 da error (supongamos que se perdio la conexion de red entre medias) la base de datos quedara con informacion incoherente, tendremos un albaran que nos indica que ha salido determinado material pero si miramos el stock, en este nos constara que tenemos articulos de mas (porque no se ha podido restar las cantidades por el error anterior).

Luego para este proceso:
-Iniciamos una transaccion (Start)
-Realizamos el punto 1
-Realizamos el punto 2
-Si todo ha ido bien, confirmamos la transaccion (Commit).
-Si se produce algun error en alguno de los puntos: cancelamos (RollBack)

Al realizarse los dos procesos dentro de una misma transaccion si el punto 2 da error y no puede realizarse, hariamos un rollback de modo que la transaccion se anularia, lo que implica que todos los procesos realizados anteriormente desde que se inicio la transaccion son cancelados, es como si nunca se hubiese realizado el punto 1, de modo que nunca tendremos incoherencias entre informacion relacionada que se encuentre guardada en distintas tablas de la base de datos.

En este ejemplo vemos que tendriamos una unica transaccion para el proceso,
pero ejecutariamos varias queries de actualizacion sobre la base de datos, todas estas queries tienen que utilizar esa misma transaccion.

Lo que si se puede hacer para ahorrar en el uso de componentes TIbTransaction es utilizar un unico componente TIbTransaction con un nivel de aislamiento: ReadCommited, para todos los procesos y queries de consulta del programa. Es decir operaciones que no impliquen modificaciones en la base de datos: listados, consultas , etc, todas podrian utilizar el mismo componente.

Saludos
Responder Con Cita