transacciones

27
UNIVERSIDAD NACIONAL “SANTIAGO ANTÚNEZ DE MAYOLO” FACULTAD DE CIENCIAS ESCUELA PROFECIONAL DE INGENIERÍA DE SISTEMAS E INFORMÁTICA SEMESTRE 2015 – I PROGRAMACIÓN III DOCENTE : ING. GONZALES RAMOS, Carlos Alberto ALUMNO : HUAMAN CAMONES, Clinton Yeferson HUARAZ – PERU TRANSACCIONES

Upload: clinton-yeferson

Post on 04-Sep-2015

220 views

Category:

Documents


6 download

DESCRIPTION

uso de transac

TRANSCRIPT

TRANSACCIONES

UNIVERSIDAD NACIONALSANTIAGO ANTNEZ DE MAYOLO

FACULTAD DE CIENCIAS

ESCUELA PROFECIONAL DE INGENIERA DE SISTEMAS E INFORMTICA

SEMESTRE 2015 IPROGRAMACIN IIITRANSACCIONES

DOCENTE : ING. GONZALES RAMOS, Carlos Alberto

ALUMNO : HUAMAN CAMONES, Clinton Yeferson

HUARAZ PERU

2015

INTRODUCCIN

Una Base de Datos Transaccional alberga la idea de o todo o mejor nada. Al ejecutar una transaccin, el motor de base de datos nos garantizar la atomicidad, consistencia, aislamiento y durabilidad (ACID) de la transaccin (o conjunto de comandos) que se utilice.El siguiente trabajo monogrfico consta de dos captulos, en la primera parte definiremos todo referido a transacciones y en la segunda parte mostraremos ejemplos con transacciones.

ContenidoINTRODUCCIN2I.TRANSACCIONES41.1.DEFINICIN41.2.PROBLEMAS DE DONDE SURGE TRANSACCIONES41.3.SOLUCIONANDO PROBLEMAS51.4.PROPIEDADES DE UNA TRANSACCIN61.4.1.Atomicidad61.4.2.Consistencia61.4.3.Aislamiento (Isolated)71.4.4.Durabilidad71.5.COMANDOS DE CONTROL DE TRANSACCIONES81.5.1.NOTA91.6.ESPECIFICAR UN NIVEL DE AISLAMIENTO9II.DESARROLLO DE TRANSACCIONES112.1.CREAR UNA INSTRUCCIN SET TRANSACTION112.3.PASO A PASO132.4.MS EJEMPLOS152.5.EJEMPLO COMPLETO DE TRANSACCIONES18Bibliografa20

I. TRANSACCIONES

1.1. DEFINICINUna transaccin es una unidad lgica de trabajo o procesamiento (ejecucin de un programa que incluye operaciones de acceso a la base de datos). Una transaccin es una secuencia de operaciones que llevan la base de datos desde un estado de consistencia a otro estado de consistencia, por esto suele decirse tambin que la transaccin es una unidad lgica de integridad. Cuando mltiples transacciones son introducidas en el sistema por varios usuarios, es necesario evitar que interfieran entre ellas de forma tal que provoquen que la BD quede en un estado no consistente; desde este punto de vista, podemos ver una transaccin como una unidad lgica de concurrencia. Cuando ocurre un fallo que provoca la cada del sistema, en el momento en el que haba varias transacciones en curso de ejecucin, muy probablemente dejar errneos los datos en la BD (estado inconsistente); en estas circunstancias, se debe garantizar que la BD pueda ser recuperada a un estado en el cual su contenido sea consistente, por esto una transaccin es considerada tambin una unidad lgica de recuperacin.

1.2. PROBLEMAS DE DONDE SURGE TRANSACCIONESRelativamente, existen muy pocas bases de datos en las cuales solamente un usuario est intentando acceder a los datos contenidos en ellas en algn momento dado. La mayora de las veces, las bases de datos son utilizadas por diferentes tipos de usuarios para muy distintos propsitos, y a menudo estos usuarios estn intentando acceder a los datos al mismo tiempo. Mientras mayor sea el nmero de usuarios, mayor ser la probabilidad de que existan problemas cuando los usuarios intenten ver o modificar los mismos datos en el mismo momento. Sin embargo, dependiendo de la naturaleza de las operaciones, los problemas pueden surgir incluso si solamente dos usuarios estn accediendo a los datos al mismo tiempo. Por ejemplo, un usuario pudiera estar viendo los datos en una tabla, tomar cierto tipo de accin basada en esos datos, y luego arrojarlos a la tabla para verificar los datos una vez ms. Sin embargo, si otro usuario actualiza la tabla entre los dos momentos que el primer usuario la visualiza, el primer usuario encontrar datos diferentes la segunda vez que lo hace, y pudiera incluso notar que la accin tomada por el segundo usuario invalid los cambios que ambos hicieron despus de haber visto la tabla por primera vez. Por ejemplo, el primer usuario pudiera haber notado que el nmero telefnico de un cliente es incorrecto y quisiera aplicar la correccin. Sin embargo, un segundo usuario pudiera estar buscando los datos del mismo cliente, y mientras ste actualiza el estatus del crdito del cliente, pudiera sin darse cuenta regresar el anterior nmero telefnico al registro de la base de datos (debido a que los datos que se estaban buscando contenan el nmero anterior), sobrescribiendo los cambios que realiz el primer usuario.

1.3. SOLUCIONANDO PROBLEMASPara encargarse de este tipo de inconsistencias en los datos mencionados en los problemas, se utiliza transacciones para controlar las acciones de los usuarios individuales. Una transaccin es una unidad de trabajo que se compone de una o ms instrucciones que realizan un conjunto de acciones relacionadas. Por ejemplo, la aplicacin podra utilizar una transaccin para cambiar el nmero de CD de las existencias. El proceso de actualizar la tabla o tablas aplicables y reportar la informacin actualizada de regreso al usuario es tratado como una sola transaccin. La transaccin puede incluir varias instrucciones, realizando cada una de ellas una tarea especfica.

1.4. PROPIEDADES DE UNA TRANSACCINPara que un conjunto de acciones califique como una transaccin, debe pasar la prueba ACID. ACID es el acrnimo comnmente utilizado para referirse a los nombres en ingls de las cuatro caractersticas de una transaccin (Atomic, Consistent, Isolated y Durable, respectivamente) que veremos a continuacin:

1.4.1. AtomicidadEsta caracterstica se refiere a la naturaleza todo-o-nada de una transaccin. Se realizan ya sea todas las operaciones en una transaccin, o ninguna de ellas. Aunque algunas instrucciones sean ejecutadas, los resultados de stas regresan a su punto inicial si la transaccin falla en cualquier punto antes de ser completada. Solamente cuando todas las instrucciones se ejecutan apropiadamente y todas las acciones se realizan, se considera completa una transaccin y sus resultados se aplican a la base de datos.

1.4.2. Consistencia La base de datos debe ser consistente al inicio y al final de la transaccin. De hecho, se puede considerar una transaccin como un conjunto de acciones que lleva a la base de datos de un estado consistente a otro. Todas las reglas que definen y limitan los datos deben ser aplicadas a esos datos como resultado de cualquier cambio que ocurra durante la transaccin. Adems, todas las estructuras dentro de la base de datos deben estar correctas al final de la transaccin.

1.4.3. Aislamiento (Isolated) Los datos que pudieran encontrarse en un estado inconsistente temporalmente durante una transaccin no debern estar disponibles a otras transacciones hasta que los datos sean consistentes una vez ms. En otras palabras, ningn usuario deber ser capaz de acceder a los datos inconsistentes durante una transaccin implementada por otro usuario cuando los datos impactados por esa transaccin estn en un estado inconsistente. Adems, cuando una transaccin se encuentra aislada, ninguna otra transaccin puede afectarla.

1.4.4. DurabilidadUna vez que los cambios hechos en una transaccin sean completados, esos cambios debern ser preservados, y los datos debern estar en un estado confiable y consistente, incluso si ocurren errores de aplicacin o de hardware.

Si surge cualquier problema en cualquier momento durante una transaccin, la transaccin completa regresa a su punto inicial y la base de datos regresa al estado en que se encontraba antes de que la transaccin iniciara. Cualquier accin que se tome es cancelada y los datos se restauran a su estado original. Si la transaccin se completa exitosamente, entonces todos los cambios son implementados. A travs de todo el proceso, la transaccin siempre asegura la integridad de la base de datos, sin importar si la transaccin fue completada exitosamente o debi regresar a su punto inicial. SQL soporta diferentes instrucciones relacionadas con el proceso de transaccin. Estas transacciones pueden ser utilizadas para iniciar y finalizar transacciones, configurar sus propiedades, aplazar la ejecucin de las restricciones durante la transaccin e identificar los puntos dentro de una transaccin que actan como puntos de recuperacin cuando las transacciones vuelven a su punto inicial. En el resto de este captulo examinaremos cmo se utiliza cada una de estas instrucciones dentro de una transaccin. Sin embargo, antes de ir a una discusin ms detallada de las instrucciones, sera mejor proporcionar un breve repaso de cada una de ellas para tener un mejor entendimiento de cmo funcionan las transacciones.

1.5. COMANDOS DE CONTROL DE TRANSACCIONESLos comandos de control de transacciones manejan de forma explcita los cambios realizados por comandos.COMANDOPROPSITO

COMMITHacer permanentes los cambios realizados por las sentencias ejecutadas en la transaccin actual, y establecer el comienzo de una nueva transaccin.

ROLLBACKFinaliza una transaccin y reinvierte todos los cambios al comienzo de la transaccin o a un punto de recuperacin.

SAVEPOINTEstablecer un punto hasta el cual se podr deshacer cambios.

SET TRANSACTIONEstablecer propiedades para la transaccin actual.

START TRANSACTIONConfigura las propiedades de una transaccin e inicia esa transaccin.

SET CONSTRAINTSDetermina el modo de restriccin dentro de una transaccin actual. El modo de restriccin se refiere a si una restriccin es aplicada inmediatamente a los datos cuando stos son modificados o si la aplicacin de la restriccin es aplazada hasta un punto posterior en la transaccin.

Las instrucciones SQL relacionadas con las transacciones: SET TRANSACTION, START TRANSACTION, COMMIT y ROLLBACK. Si se utiliza una instruccin SET TRANSACTION, sta se ejecuta antes de que la transaccin inicie. Despus de eso, una instruccin START TRANSACTION inicia la transaccin.1.5.1. NOTACuando se inicia la transaccin, la base de datos se encuentra en su estado original (los datos son consistentes y correctos). Despus se procesan las instrucciones SQL dentro de la transaccin. Si este proceso es exitoso, se ejecuta una instruccin COMMIT. La instruccin COMMIT provoca que la implementacin SQL actualice la base de datos y finalice la transaccin. Si el proceso de ejecucin de la instruccin no es exitoso, se ejecuta una instruccin ROLLBACK y la implementacin regresa la base de datos a su estado original. Una ejecucin no exitosa no significa necesariamente que las instrucciones hayan fallado. Una instruccin ROLLBACK puede ser ejecutada de acuerdo con las condiciones de una clusula WHERE, un error predefinido, o por cualquier otra condicin que sea definida dentro de la transaccin. El punto es que, bajo ciertas circunstancias, se ejecuta la instruccin ROLLBACK, y bajo otras circunstancias se ejecuta la instruccin COMMIT.

1.6. ESPECIFICAR UN NIVEL DE AISLAMIENTO Cuando se crea una instruccin SET TRANSACTION, se pueden especificar los niveles de aislamiento cero o uno. Un nivel de aislamiento define cmo sera aislar una transaccin desde las acciones de otras transacciones. Una instruccin SET TRANSACTION soporta cuatro opciones del nivel de aislamiento: READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE Los niveles de aislamiento estn enlistados del menos restrictivo al ms restrictivo, siendo la opcin READ UNCOMMITTED la menos efectiva en trminos de aislar los datos, y la opcin SERIALIZABLE la ms efectiva. Si no se especifica ningn nivel de aislamiento, se asume SERIALIZABLE de manera preestablecida.

II. DESARROLLO DE TRANSACCIONES

2.1. CREAR UNA INSTRUCCIN SET TRANSACTION Ahora que hemos visto los diferentes componentes de la instruccin SET TRANSACTION, demos un vistazo a un par de ejemplos. El primer ejemplo define una transaccin con un nivel de acceso READ ONLY, un nivel de aislamiento READ UNCOMMITTED y un tamao de diagnstico de 5: SET TRANSACTIONREAD ONLY,ISOLATION LEVEL READ UNCOMMITTED,DIAGNOSTICS SIZE 5;Los modos de transaccin estn separados por comas tambin que la opcin del nivel de aislamiento incluye las palabras clave ISOLATION LEVEL, y que la opcin del tamao de diagnstico incluye las palabras clave DIAGNOSTICS SIZE. La transaccin est configurada con el nivel de aislamiento restrictivo ms bajo, y sta es la razn de que el nivel de acceso debe ser READ ONLY. No es posible definir un nivel de acceso READ WRITE para esta instruccin. Debido a que el nivel de aislamiento es READ COMMITTED, la instruccin no tiene que especificar el nivel de acceso READ ONLY (debido a que ya es asumido). Sin embargo, el incluirlo no causa ningn problema y documenta el cdigo de mejor manera. En el siguiente ejemplo, la instruccin SET TRANSACTION define una transaccin con un nivel de acceso READ WRITE, un nivel de aislamiento SERIALIZABLE y un tamao de diagnstico de 8: SET TRANSACTIONREAD WRITE,ISOLATION LEVEL SERIALIZABLE,DIAGNOSTICS SIZE 8;

2.2. INICIAR UNA TRANSACCINUna transaccin puede ser iniciada ya sea implcita o explcitamente. Una transaccin inicia implcitamente cuando ciertos tipos de instrucciones SQL son ejecutadas, por ejemplo, las instrucciones SELECT, DELETE, UPDATE y CREATE TABLE. Estos tipos de instrucciones deben ejecutarse dentro del contexto de una transaccin. Si ninguna transaccin est activa, una de ellas es iniciada. Las transacciones tambin pueden ser iniciadas explcitamente utilizando la instruccin START TRANSACTION. Esta instruccin sirve para dos propsitos: establecer las propiedades de la transaccin e iniciar la transaccin. En trminos de establecer las propiedades, la instruccin START TRANSACTION funciona de la misma manera que la instruccin SET TRANSACTION. Se puede establecer el nivel de acceso, el nivel de aislamiento y el tamao de diagnstico. Al igual que para iniciar una transaccin, simplemente se ejecuta la instruccin START TRANSACTION.START TRANSACTIONREAD ONLY,ISOLATION LEVEL READ UNCOMMITTED,DIAGNOSTICS SIZE 5;TRABAJAR CON TRANSACIONESEn este ejercicio se crearn varias transacciones que ejecutan instrucciones para la base de datos INVENTARIO. Para cada transaccin se iniciar explcitamente la transaccin y se ejecutarn una o ms instrucciones SQL. Para este ejercicio se trabajar con la instruccin COMMIT y con la instruccin ROLLBACK en transacciones separadas debido a que se est trabajando con invocacin directa de SQL (en la aplicacin cliente).

2.3. PASO A PASOa) Conectarse a una base de datos, en este lo siguiente usaremos la base de datos INVENTARIO.b) La primera transaccin que se crear utiliza una instruccin START TRANSACTION para determinar el nivel de aislamiento a READ UNCOMMITTED, recupera informacin de la tabla ARTISTAS, y luego completa la transaccin. Ingrese y ejecute la siguiente instruccin SQL:START TRANSACTIONISOLATION LEVEL READ UNCOMMITTED;SELECT * FROM ARTISTAS;COMMIT;La transaccin deber arrojar todas las filas y columnas de la tabla ARTISTAS.c) La siguiente transaccin que se crear tambin utiliza una instruccin START TRANSACTION para determinar el nivel de aislamiento. Pero esta vez se determinar el nivel como SERIALIZABLE. Debido a que SERIALIZABLE es el nivel preestablecido, no se requiere definirlo; sin embargo, para los propsitos de este ejercicio, vamos a incluirlo. Despus de que se inicia la transaccin, se intentar actualizar la tabla DISCO_COMPACTO incrementando el valor EN_EXISTENCIA por 2 para todas las filas con un valor ID_DISQUERA igual a 832. Despus de la instruccin UPDATE, se reinvertir la transaccin para que ningn dato sea modificado en la base de datos. Ingrese y ejecute la siguiente instruccin: START TRANSACTIONISOLATION LEVEL SERIALIZABLE;UPDATE DISCOS_COMPACTOSSET EN_EXISTENCIA = EN_EXISTENCIA + 2WHERE ID_DISQUERA = 832; ROLLBACK;Se deber recibir algn tipo de mensaje avisando la finalizacin de la transaccind) Ahora se confirmar que la actualizacin que se intent en el paso anterior haya sido en realidad reinvertida. Ingrese y ejecute la siguiente instruccin SQL: SELECT TITULO_CD, EN_EXISTENCIAFROM DISCOS_COMPACTOSWHERE ID_DISQUERA = 832;La instruccin SELECT deber arrojar los siguientes resultados de la consultaLos valores EN_EXISTENCIA mostrados en estos resultados son los que estaban contenidos en la tabla DISCO_COMPACTO antes de que se ejecutara la transaccin. Si la transaccin no hubiera sido reinvertida, cada uno de estos valores se habra incrementado por 2.e) Ahora vamos a agregar un punto de recuperacin a la transaccin que se cre en el paso anterior. Se requiere asegurarse de referirse al punto de recuperacin en la instruccin ROLLBACK. Tambin se agregar una instruccin SELECT antes del punto de recuperacin. Ingrese y ejecute la siguiente instruccin SQL: START TRANSACTION ISOLATION LEVEL SERIALIZABLE;SELECT TITULO_CD, EN_EXISTENCIAFROM DISCOS_COMPACTOSWHERE ID_DISQUERA = 832; SAVEPOINT SECCION_1;UPDATE DISCOS_COMPACTOSSET EN_EXISTENCIA = EN_EXISTENCIA + 2WHERE ID_DISQUERA = 832;ROLLBACK TO SAVEPOINT SECCION_1;Ahora la transaccin solamente se reinvertir al punto anterior a la instruccin UPDATE. Adems, debido a que la transaccin inclua una instruccin SELECT, se debern recibir los resultados de la consulta que se recibieron en el paso anteriorf) En la transaccin anterior, la instruccin SELECT estaba antes del punto de recuperacin, lo que significa que la instruccin SELECT fue ejecutada antes que la instruccin UPDATE. Si la transaccin no reinvirtiera la actualizacin, los resultados de la consulta no reflejaran la informacin correcta. Como resultado, se deber verificar que la instruccin UPDATE haya sido reinvertida. Ingrese y ejecute la siguiente instruccin SQL: SELECT TITULO_CD, EN_EXISTENCIAFROM DISCOS_COMPACTOSWHERE ID_DISQUERA = 832;Los resultados de la consulta debern mostrar los mismos valores EN_EXISTENCIA que los resultados de la consulta arrojados en los dos pasos anteriores.g) Cierre la aplicacin de base de datos utilizada.

2.4. MS EJEMPLOSEjemplo 1: START TRANSACTION;SELECT @A:=SUM(salary)FROM table1WHERE type=1;UPDATE table2 SET summary=@A WHERE type=1;COMMIT;

Ejemplo 2: Veremos un ejemplo completo, donde utilizaremos START TRANSACTION (no es necesario AUTOCOMMIT en 0)

CREATE TABLE `departamentos`( `CODIGO` INTEGER(11) NOT NULL DEFAULT 0,`NOMBRE` VARCHAR(100),`PRESUPUESTO` INTEGER(11) DEFAULT NULL,PRIMARY KEY (`CODIGO`) )ENGINE=InnoDBAhora, insertaremos registros de la tabla departamentos_externos a departamentos mediante una transaccin: START TRANSACTION;SELECT @A := presupuestoFROM departamentos_externosWHERE codigo =11;INSERT INTO departamentos( codigo, nombre, presupuesto )VALUES ( 11, Department test, @A );COMMIT; En el ejemplo anterior se guard el presupuesto del departamento externo 11 en la variable @A y luego fue asignado al presupuesto en la tabla departamentos. Ejemplo 3: START TRANSACTION;SELECT @A := presupuesto, @B := codigo, @C := nombreFROM departamentos_externosWHERE codigo=33;INSERT INTO departamentos( codigodep, nombredep, presupuesto)VALUES (@B , @C , @A );COMMIT ;

Ejemplo 4START TRANSACTION;SELECT @A:=PRESUPUESTO FROM departamentos_externos WHERE codigo=11;UPDATE departamentosSET PRESUPUESTO = PRESUPUESTO + @AWHERE codigo=33;COMMIT;

2.5. EJEMPLO COMPLETO DE TRANSACCIONES##PRIMERO CREAMOS UNA BASE DE DATOSCREATE DATABASE CLINTONTRANSAC;## BASE DE DATOS A USARUSE CLINTONTRANSAC;## LUEGO SE PASARA CREAMOS TABLAS PARA HACER LAS ##TRANSACCIONESCREATE TABLE DATOS(CODIGO INTEGER(11) NOT NULL DEFAULT '0',NOMBRE VARCHAR(50),APELLIDO VARCHAR(50),CURSO VARCHAR(50),OBS INTEGER(11) DEFAULT NULL,PRIMARY KEY (CODIGO))ENGINE=InnoDB;##CREAMOS LA SEGUNDA TABLA DONDE AREMOS LAS ##TRANSACCIONESCREATE TABLE ESCUELA(CODIGO INTEGER(11) NOT NULL DEFAULT '0',NOMBRE VARCHAR(50),DOCENTE VARCHAR(50),CURSO VARCHAR(50),OBS INTEGER(11) DEFAULT NULL,PRIMARY KEY (CODIGO))ENGINE=InnoDB;##SELECCIONAMOS LOS CAMPOS QUE QUERAMOS HACER LA ##TRANSACCION EN EL EJEMPLO

##SOLO AREMOS LA TRANSACCION## DEL CURSO Y OBS DE LA TABLA DATOS A LA TABLA ##ESCUELASTART TRANSACTION;SELECT @A := CURSO, @B := OBSFROM DATOSWHERE CODIGO =1;## AHORA INSERTAMOS LA TRANSACCION HECHAINSERT INTO ESCUELA( CODIGO, NOMBRE, DOCENTE, CURSO, OBS )VALUES ( 1, 'SISTEMAS','GONZALES RAMOZ',@A, @B );COMMIT;## LUEGO NOS MOSTRAR LA TRANSACCION ##DESARROLLADASELECT * FROM escuela e;

15

CONCLUSIONES Para concluir podemos decir que las transacciones son de mucha ayuda aunque son un tanto difciles de comprender y de realizar, adems hay que tomar en cuenta que al realizar una transaccin en MySQL que apenas se realice un INSERT, UPDATE o DELETE se genera un bloqueo sobre la tabla y que otros clientes no pueden acceder a la tabla para escribir en esta. Otros clientes podrn realizar SELECT sobre la tabla, pero no podrn ver los datos del primer cliente hasta que los mismos sean confirmados.

BibliografaGilfillan, Lan. la biblia de MySQL. Mexico: Anaya, 2009.Sheldon, Andy Oppel Robert. fundamentos de SQL. Mexico: Mc Graw Hil, 2010.SILBERSCHATZ, A., KORTH, H.F., SUDARSHAN, S. fundamentos de base de datos. 3 edicin,: McGraw-Hill, 2000.