AR IA, F OR SIT TA L U C O IZ S MEXICO DE EL EN CI EXC A A UN ER EZ IV AR D E M ATA M O R PROGRAMA ACADÉMICO DE TECNOLOGÍAS DE LA INFORMACIÓN Comandos para Transacciones Base de Datos para Aplicaciones Alumno Noche Aviles Adriana Guadalupe Cuate González Claudia Maya Tapia José Hilario No. Control TI102922 TI102972 TI102965 Gonzalo Rosas Cabrera Izúcar de Matamoros, Pue., 21 de febrero de 2011 RESUMEN En todo sistema de gestor de base de datos tiene que estar la de permitir al programador crear Transacciones. El Msql nos permite trabajar con transacciones de manera más sencilla y eficaz. Al ejecutar una transacción, el motor de base de datos nos garantizará la atomicidad, consistencia, aislamiento y durabilidad (ACID) de la transacción (o conjunto de comandos) que se utilice. 1 1 DESARROLLO COMANDOS PARA TRANSACCIONES • BEGIN DISTRIBUTED TRANSACTION Descripción: Especifica el inicio de una transacción distribuida de Transact-SQL administrada mediante el Coordinador de transacciones distribuidas de Microsoft (MS DTC). Sintaxis BEGIN DISTRIBUTED { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] [;] Ejemplo Este ejemplo elimina un candidato de la base de datos AdventureWorks2008R2 tanto en la instancia local del Motor de base de datos como en la instancia de un servidor remoto. Ambas bases de datos, local y remota, confirmarán o revertirán la transacción. Sintaxis USE AdventureWorks2008R2; GO BEGIN DISTRIBUTED TRANSACTION; 2 -- Delete candidate from local instance. DELETE AdventureWorks2008R2.HumanResources.JobCandidate WHERE JobCandidateID = 13; -- Delete candidate from remote instance. DELETE RemoteServer.AdventureWorks2008R2.HumanResources.JobCandidate WHERE JobCandidateID = 13; COMMIT TRANSACTION; GO • BEGIN TRANSACTION Descripccion: Marca el punto de inicio de una transacción local explícita. La instrucción BEGIN TRANSACTION incrementa @@TRANCOUNT en 1. Sintaxis BEGIN { TRAN | TRANSACTION } [ { transaction_name | @tran_name_variable } [ WITH MARK [ 'description' ] ] ] [;] Ejemplo Acontinuacion se muestra cómo marcar una transacción. 3 Sintaxis BEGIN TRANSACTION CandidateDelete WITH MARK N'Deleting a Job Candidate'; GO USE AdventureWorks2008R2; GO DELETE FROM AdventureWorks2008R2.HumanResources.JobCandidate WHERE JobCandidateID = 13; GO COMMIT TRANSACTION CandidateDelete; GO • COMMIT TRANSACTION Descripción: Marca el final de una transacción correcta, implícita o explícita. Si @@TRANCOUNT es 1, COMMIT TRANSACTION hace que todas las modificaciones efectuadas sobre los datos desde el inicio de la transacción sean parte permanente de la base de datos, libera los recursos mantenidos por la transacción y reduce @@TRANCOUNT a 0. Si @@TRANCOUNT es mayor que 1, COMMIT TRANSACTION solo reduce @@TRANCOUNT en 1 y la transacción sigue activa. Sintaxis COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ] [;] Ejemplo 4 Se elimina a un candidato a un puesto de trabajo. Sintaxis USE AdventureWorks2008R2; GO BEGIN TRANSACTION; GO DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 13; GO COMMIT TRANSACTION; GO • COMMIT WORK Descripccion: Marca el final de una transacción Sintaxis COMMIT [ WORK ] [;] • ROLLBACK TRANSACTION 5 Descripción: Revierte una transacción explícita o implícita hasta el inicio de la transacción o hasta un punto de retorno dentro de la transacción. Sintaxis ROLLBACK { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] [;] Ejemplo Se muestra el efecto de revertir una transacción con nombre. Sintaxis USE TempDB; GO CREATE TABLE ValueTable ([value] int) GO DECLARE @TransactionName varchar(20) = 'Transaction1'; --These statements start a named transaction, --insert a two records, and then roll back --the transaction named in the variable 6 --@TransactionName. BEGIN TRAN @TransactionName INSERT INTO ValueTable VALUES(1) INSERT INTO ValueTable VALUES(2) ROLLBACK TRAN @TransactionName INSERT INTO ValueTable VALUES(3) INSERT INTO ValueTable VALUES(4) SELECT * FROM ValueTable DROP TABLE ValueTable --Results --value --------------3 --4 • ROLLBACK WORK Descripción: Revierte una transacción especificada por el usuario al principio de la misma Sintaxis ROLLBACK [ WORK ] [;] 7 • SAVE TRANSACTION Descripción: Establece un punto de retorno dentro de una transacción. Sintaxis SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable } [;] Ejemplo se muestra el uso de un punto de retorno de una transacción para revertir únicamente las modificaciones realizadas por un procedimiento almacenado si una transacción activa se inicia antes de la ejecución del procedimiento almacenado. Sintaxis 8 USE AdventureWorks2008R2; GO IF EXISTS (SELECT name FROM sys.objects WHERE name = N'SaveTranExample') DROP PROCEDURE SaveTranExample; GO CREATE PROCEDURE SaveTranExample @InputCandidateID INT AS -- Detect whether the procedure was called -- from an active transaction and save -- that for later use. -- In the procedure, @TranCounter = 0 -- means there was no active transaction -- and the procedure started one. -- @TranCounter > 0 means an active -- transaction was started before the -- procedure was called. DECLARE @TranCounter INT; SET @TranCounter = @@TRANCOUNT; IF @TranCounter > 0 -- Procedure called when there is -- an active transaction. -- Create a savepoint to be able -- to roll back only the work done -- in the procedure if there is an -- error. SAVE TRANSACTION ProcedureSave; ELSE -- Procedure must start its own 9 -- transaction. BEGIN TRANSACTION; -- Modify database. BEGIN TRY DELETE HumanResources.JobCandidate WHERE JobCandidateID = @InputCandidateID; -- Get here if no errors; must commit -- any transaction started in the -- procedure, but not commit a transaction -- started before the transaction was called. IF @TranCounter = 0 -- @TranCounter = 0 means no transaction was -- started before the procedure was called. -- The procedure must commit the transaction -- it started. COMMIT TRANSACTION; END TRY BEGIN CATCH -- An error occurred; must determine -- which type of rollback will roll -- back only the work done in the -- procedure. IF @TranCounter = 0 -- Transaction started in procedure. -- Roll back complete transaction. ROLLBACK TRANSACTION; ELSE -- Transaction started before procedure -- called, do not roll back modifications -- made before the procedure was called. IF XACT_STATE() <> -1 10 -- If the transaction is still valid, just -- roll back to the savepoint set at the -- start of the stored procedure. ROLLBACK TRANSACTION ProcedureSave; -- If the transaction is uncommitable, a -- rollback to the savepoint is not allowed -- because the savepoint rollback writes to -- the log. Just return to the caller, which -- should roll back the outer transaction. -- After the appropriate rollback, echo error -- information to the caller. DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(); SELECT @ErrorSeverity = ERROR_SEVERITY(); SELECT @ErrorState = ERROR_STATE(); RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState -- State. ); END CATCH GO 11 2.-CONCLUSIONES Y RECOMENDACIONES Por lo visto los comandos de transacciones son muy fáciles de usar por supuesto este tipo de transacciones no requieren de nuestra intervención puesto que el sistema se encarga de todo. Sin embargo si hay que realizar varias operaciones y queremos que sean tratadas como una unidad tenemos que crear esas transacciones de manera explícita. 12