Está en la página 1de 5

c

c
c
c
c
c
Una transacción propiamente es un acceso a la Base de Datos. Las
Transacciones fueron implementadas en el mundo Fox en la versión 3.0 pero en
otras Bases de Datos existen desde hace tiempo.

Una transacción actúa como un log que controla las operaciones de


actualización de datos en la memoria o en el disco, dependiendo de la
implementación y de los requerimientos del sistema, más bien que aplicando estas
actualizaciones directamente a la base de datos. La actualización de la base de
datos es realizada al final de las transaccion. Si por alguna razón el sistema no
puede realizar la actualización de la base de datos, se puede volver atrás la entera
transacción y no realizar ninguna de las operaciones que se han realizado.

2    
            
      
   
   
     

           
       
   2 

! 

    "
  



r c cc



c  c cc 
 
c

c
c

c
 c
c
c c
c c

r¦

c c
c
c
cc 
c c  c


c
c 

c

r
 c cc

c
c c
c
 c
c
 
ccc c

cc  c
c cc

c c cc c  c

ru   ccc

c
c   c





c c


c
c
c c
c c
c

c
 c
ccc

c

cc  c
c  c
  c c  c
cc
 c
c c c
 c
c  c

c ccc

° 2°      #$%     !  



 



cc
½  
cc
VFP SQL Server
BEGIN TRANSACTION BEGIN TRANSACTION
SET IMPLICIT_TRANSACTIONS ON
END TRANSACTION COMMIT
ROLLBACK ROLLBACK
TnxLevel() @@TranCount
cc

Ô  TRASACT Incia la transacción
RLLÔACK Vuelve a la situación original sin
cambios desde el último BEGIN TRANSACTION
 TRASACTCT Bloquea los registros, graba a disco todos
los cambios hechos en las tablas de las base de datos desde el
más reciente BEGIN TRANSACTION. A continuación bloquea los
registros.
2 
     2  


En SQL Server las Transacciones son algo diferentes pues se pueden
distinguir de dos tipos: implícitas o explícitas.

Las Transacciones Implícitas las crea el propio sistema y las explícitas las
escribes tú empezando con BEGIN TRANSACTION y acabando con COMMIT o
ROLLBACK

Las implícitas se crean incluso con una simple SELECT. Aunque no lo


veas, antes de hacer la SELECT, SQL Server habre una transacción y al final la
cierra. Esto tiene múltiples ventajas pues si sé que cada operación en la Base de
Datos me crea de forma automática una transacción, podría cerrarla de forma
manual. Por ejemplo, el siguiente Trigger rechazará cualquier actualización de la
tabla de productos que toque el precio (fíjate que no hay inicio de transacción pero
sí de cierre):

¦   



 




 

  



  

 

     
 

! 

Si tienes dos tablas relacionadas del tipo pedidos y líneas_de_pediodo y
quieres borrar un pedido entero con sus líneas, esto por defecto creará dos
transacciones. Para crear una sola transacción deberás establecer las
transacciones como manuales para o borrar los dos registros o no borrar ninguno.

En las transacciones tenemos más diferencias con respecto a Fox y es que


mientras en Fox sólo puedes crear 5 niveles de profundidad en las transacciones,
aquí puedes crear ilimitados.

Otra diferencia importante es que en Fox necesitas tantos


(EndTransactionóRollback) cuantas transacciones tengas, sin embargo en SQL
Server un error en una transacción en por ejemplo el tercer nivel de profundidad te
desmonta todas las operaciones de todos los niveles (de arriba y de debajo de esa
transaccion)

Cuando estás haciendo aplicaciones Cliente/Servidor desde Fox puedes


indicarle al Servidor que las transacciones las vas a manejar tú mediante la
instrucción :

"#!$$% &'  
 '&(c
cc
Si usas las transacciones en manual es muy importante al acabar acordarse
de ponerlas en automático otra vez. Mira el siguiente código:

]"#$
) &'  
 '&(**+, ,
- ))
 ./

]"#!/) & 
01
2  
3) 

4  56 
] 7  8/ **+, ,- 
7  )

 
  

]"#!/% &   
3) 
4  56 
]"#!/) & 
01
2  
3) 

4  56 
] 7  8/ **+, ,9 
7 
 )

 
  

]"#
) 
]"#!/) & 
01
2  
3) 

4  56 
] 7  8/ **+, ,- 
7  )

 
  

]"#$
) &'  
 '&-


Como ves el equivalente del BEGIN TRANSACTION es el SQLSETPROP().
En las líneas anteriores se podría meter un control de devolución de parámetros
para controlar que el valor devuelto por cada uno de los SQLEXEC es el correcto.
Podríamos escribir algo así:


]"#$
) &'  
 '&(**+, ,
- ))
 ./

  
5"#!/% &   
3) 

4  56 
  
:;-
"#
) 
< 
/
)
2 
 
!+
  
5"#!/) &  
 4 4  
3) 
4  56 
  
:;-
"#
) 
< 
/
)
2 
 
!+
"#¦
22
]"#$
) &'  
 '&-
< 
/)


2 

No obstante, trabajar con con el SQLSetProp(gnhandle,¶Transactions¶,1) es un
poco oscurantista ya que desde Fox podemos trabajar directamente con las
transacciones explícitas del SQL Server:

El anterior código lo podríamos traducir a éste:



"#!=!¦% &'!>¦'
#  
-5"#!/% &   
3) 

4  56 
#  
(5"#!/) & 
  4 4  
3) 
4  56 

  
-5-  
(5-
"#!=!¦% &'?? ¦
;9¦<<'
!#!
"#!=!¦% &'?? ¦
;9##¦@'
!+

Como se puede ver este código es mucho más limpio y fácil de seguir. La
variable @@TranCount nos devuelve el número de transacción.

En SQL Server tenemos algunas otras opciones que nos pueden servir de
utilidad como la variable @@NESTLEVEL que nos indica en que nivel de
profundidad de las transacciones estamos metidos.

De todos modos creo que con estos ejemplos, hay suficiente.


c
c

°   
  
¦    
 
 
 
 

   
     
     

 
 
     
 
     
 
 
 

  
 


 

        
      
  
 
 
    !"#  $  
  
 
 
 
 
  %&   %   
 
 
       ' '     

  
           
       
   
  

  "(#¦)
!"# 

$    

 
 
  

 %&   

 
 

   ' '  

  
  



 ¦(**!!"# 

 
!   
      %+
 

   ,     
 
 
  
          

USE NorthWind
DECLARE @Error int
--Declaramos una variable que utilizaremos para almacenar un posible
código de error

BEGIN TRAN
--Iniciamos la transacción
UPDATE Products SET UnitPrice=20 WHERE ProductName ='Chai'
--Ejecutamos la primera sentencia
SET @Error=@@ERROR
--Si ocurre un error almacenamos su código en @Error
--y saltamos al trozo de código que deshara la transacción. Si, eso de
ahí es un
--GOTO, el demonio de los programadores, pero no pasa nada por usarlo
--cuando es necesario
IF (@Error<>0) GOTO TratarError

--Si la primera sentencia se ejecuta con éxito, pasamos a la segunda


UPDATE Products SET UnitPrice=20 WHERE ProductName='Chang'
SET @Error=@@ERROR
--Y si hay un error hacemos como antes
IF (@Error<>0) GOTO TratarError

--Si llegamos hasta aquí es que los dos UPDATE se han completado con
--éxito y podemos "guardar" la transacción en la base de datos
COMMIT TRAN

TratarError:
--Si ha ocurrido algún error llegamos hasta aquí
If @@Error<>0 THEN
BEGIN
PRINT 'Ha ecorrido un error. Abortamos la transacción'
--Se lo comunicamos al usuario y deshacemos la transacción
--todo volverá a estar como si nada hubiera ocurrido
ROLLBACK TRAN
END
c
c
c
c
ccc
c cc  c
'  

    
'  
      
   


 
'  
   
 
  c c c 
c c c
  c
'  

    
'  
      
   


 
'  
  

  c

También podría gustarte