traducción de transaction

29
¿Qué es una transacción? Una transacción es una unidad lógica de trabajo solicitado por un usuario para ser aplicada a los objetos de la base. Servidor MySQL introduce el concepto de transacción para permitir que los usuarios agrupar una o más sentencias de SQL en una sola transacción, por lo que los efectos de todas las sentencias SQL en una transacción pueden ser comprometidos (aplicado a la base de datos) o todos revertido (deshecho de la base de datos). El concepto de transacción sólo funciona en tablas que utilizan motores de almacenamiento transaccionales, como InnoDB y BDB. Para motores de almacenamiento transaccionales insegura, como MyISAM, se ignorará transacción. Cómo iniciar una nueva transacción? Servidor MySQL ofrece dos modos de manejar las transacciones: • Autocommit On - Modo predeterminado. Se puede empezar con el comando "AUTOCOMMIT = 1 SET". En este modo, cada instrucción SQL única es una nueva transacción. Todos los cambios se han comprometido al final de la ejecución de la sentencia. • Autocommit Off - se puede iniciar con "= 0 SET AUTOCOMMIT" de comandos. En este modo, varias sentencias SQL se pueden agrupar en una sola transacción. Cuando un programa cliente inicia una nueva sesión de conexión con el servidor de MySQL, el programa cliente puede iniciar una nueva transacción implícita o explícitamente en las siguientes maneras: • En el modo "Autocommit On", cada sentencia ejecutable comenzará implícitamente una nueva operación de un único estado.

Upload: carlos

Post on 15-Sep-2015

16 views

Category:

Documents


2 download

DESCRIPTION

Traduccion del subetma TRANSACTION, administracion de Base de Datos, con Ejemplos

TRANSCRIPT

Qu es una transaccin?Una transaccin es una unidad lgica de trabajo solicitado por un usuario para ser aplicada a los objetos de la base. Servidor MySQL introduce el concepto de transaccin para permitir que los usuarios agrupar una o ms sentencias de SQL en una sola transaccin, por lo que los efectos de todas las sentencias SQL en una transaccin pueden ser comprometidos (aplicado a la base de datos) o todos revertido (deshecho de la base de datos).El concepto de transaccin slo funciona en tablas que utilizan motores de almacenamiento transaccionales, como InnoDB y BDB. Para motores de almacenamiento transaccionales insegura, como MyISAM, se ignorar transaccin.

Cmo iniciar una nueva transaccin?Servidor MySQL ofrece dos modos de manejar las transacciones: Autocommit On - Modo predeterminado. Se puede empezar con el comando "AUTOCOMMIT = 1 SET". En este modo, cada instruccin SQL nica es una nueva transaccin. Todos los cambios se han comprometido al final de la ejecucin de la sentencia. Autocommit Off - se puede iniciar con "= 0 SET AUTOCOMMIT" de comandos. En este modo, varias sentencias SQL se pueden agrupar en una sola transaccin.Cuando un programa cliente inicia una nueva sesin de conexin con el servidor de MySQL, el programa cliente puede iniciar una nueva transaccin implcita o explcitamente en las siguientes maneras: En el modo "Autocommit On", cada sentencia ejecutable comenzar implcitamente una nueva operacin de un nico estado. En el modo "Autocommit Off", la primera instruccin ejecutable de una nueva sesin comenzar implcitamente una nueva transaccin de instrucciones mltiples. En el modo "Autocommit Off", la primera instruccin ejecutable despus de una transaccin anterior se ha terminado comenzar implcitamente una nueva transaccin de instrucciones mltiples. En el modo "Autocommit On" o el modo "Autocommit Off", "START TRANSACTION" se iniciar de forma explcita una nueva transaccin de instrucciones mltiples.

Cmo Terminar la transaccin actual?Hay varias formas de la transaccin actual se puede terminar de forma implcita o explcita: En el modo "Autocommit On", una operacin de un nico estado se termin de forma implcita cuando la ejecucin de la sentencia termina. Se comprometern cambios. Ejecutar el comando COMMIT terminar explcitamente la transaccin actual. Se comprometern cambios. Ejecutar el comando ROLLBACK terminar explcitamente la transaccin actual. Los cambios se pueden revertir. Ejecutar el comando START TRANSACTION terminar explcitamente la transaccin actual. Se comprometern cambios. La ejecucin de cualquier sentencia DDL se implcitamente terminar la transaccin actual. Se comprometern cambios. Desconexin de una sesin del cliente ser implcitamente terminar la transaccin actual. Los cambios se pueden revertir. Matando una sesin de cliente va implcita terminar la transaccin actual. Los cambios se pueden revertir.Cmo crear una tabla de Pruebas de transacciones? Si usted desea aprender la gestin de transacciones, debe crear una tabla con el motor de almacenamiento InnoDB. El motor de almacenamiento por defecto MyISAM no soporta el concepto de transaccin. El ejercicio tutorial a continuacin muestra un buen ejemplo de la creacin de una nueva tabla con el motor de almacenamiento InnoDB:1. >\mysql\bin\mysql -u dev -piyf fyi1. 1. mysql> DROP TABLE fyi_links;1. 1. mysql> CREATE TABLE fyi_links (id INTEGER PRIMARY KEY,1. url VARCHAR(16) NOT NULL,1. notes VARCHAR(16),1. counts INTEGER,1. created TIMESTAMP DEFAULT CURRENT_TIMESTAMP())1. ENGINE = InnoDB;1. Query OK, 0 rows affected (0.25 sec)1. 1. mysql> SHOW CREATE TABLE fyi_links;1. CREATE TABLE `fyi_links` (1. `id` int(11) NOT NULL,1. `url` varchar(16) NOT NULL,1. `notes` varchar(16) default NULL,1. `counts` int(11) default NULL,1. `created` timestamp NOT NULL default CURRENT_TIMESTAMP,1. PRIMARY KEY (`id`)1. ) ENGINE=InnoDB DEFAULT CHARSET=latin11. 1 row in set (0.05 sec)

Usted debe mantener esta tabla para practicar otros ejercicios tutoriales presentados en esta coleccin.Cmo cambiar entre Autocommit-On y Off-Modos Autocommit? De forma predeterminada, la sesin de conexin ser en modo de confirmacin automtica-On, en el que cada instruccin ejecutable del servidor se iniciar una nueva transaccin, y finalizar la transaccin cuando termina la ejecucin. Se comprometern cambios. As que considera este modo como modo de transaccin autocommitted de un nico estado. Si no te gusta el modo Autocommitt-On defecto, puede utilizar el "SET AUTOCOMMIT = 0" para cambiar al modo Autocommitt-Off. Por supuesto, puede cambiar de nuevo el modo Autocommitt-On con el "= 0 SET AUTOCOMMIT" de comandos. El siguiente ejercicio tutorial muestra algunos buenos ejemplos:1. >\mysql\bin\mysql -u dev -piyf fyi1. 1. mysql> -- You are in the default Autocommit-On mode now1. 1. mysql> SET AUTOCOMMIT = 0;1. Query OK, 0 rows affected (0.03 sec)1. 1. mysql> -- You are in the Autocommit-Off mode now1. 1. mysql> SET AUTOCOMMIT = 0;1. Query OK, 0 rows affected (0.03 sec)1. 1. mysql> -- You are back in the Autocommit-On mode now

Cmo averiguar el modo de transaccin actual? Si usted no est seguro acerca de su modo de transaccin actual, puede utilizar el "AUTOCOMMIT SELECT@@FROM DUAL" declaracin para saber como se muestra en el siguiente ejercicio tutorial:1. >\mysql\bin\mysql -u dev -piyf fyi1. 1. mysql> SELECT @@AUTOCOMMIT FROM DUAL;1. +--------------+1. | @@AUTOCOMMIT |1. +--------------+1. | 1 |1. +--------------+1. 1 row in set (0.00 sec)1. 1. mysql> SET AUTOCOMMIT = 0;1. Query OK, 0 rows affected (0.03 sec)1. 1. mysql> SELECT @@AUTOCOMMIT FROM DUAL;1. +--------------+1. | @@AUTOCOMMIT |1. +--------------+1. | 0 |1. +--------------+1. 1 row in set (0.00 sec)1. 1. mysql> SET AUTOCOMMIT = 1;1. Query OK, 0 rows affected (0.00 sec)1. 1. mysql> SELECT @@AUTOCOMMIT FROM DUAL;1. +--------------+1. | @@AUTOCOMMIT |1. | 1 |1. +--------------+1. 1 row in set (0.00 sec)

Cmo iniciar una nueva transaccin explcitamente? Si usted est confundido sobre las nuevas reglas implcitas de transaccin, siempre se puede iniciar una nueva transaccin con el comando "START TRANSACCIN" para iniciar una nueva transaccin explcita. "START TRANSACCIN" comando funciona en ambos modos "Autocommit On" y "Off" confirmacin automtica. El ejercicio siguiente tutorial muestra cmo iniciar una transaccin explcita:1. >\mysql\bin\mysql -u dev -piyf fyi1. 1. mysql> START TRANSACTION;1. Query OK, 0 rows affected (0.01 sec)1. 1. mysql> INSERT INTO fyi_links (url, id)1. VALUES ('fyicenter.com', 101);1. Query OK, 1 row affected (0.11 sec)1. 1. mysql> INSERT INTO fyi_links (url, id)1. VALUES ('centerfyi.com', 110);1. Query OK, 1 row affected (0.00 sec)1. 1. mysql> SELECT * FROM fyi_links;1. +-----+---------------+-------+--------+--------------------1. | id | url | notes | counts | created 1. +-----+---------------+-------+--------+--------------------1. | 101 | fyicenter.com | NULL | NULL | 2006-07-01 20:27:491. | 110 | centerfyi.com | NULL | NULL | 2006-07-01 20:28:101. +-----+---------------+-------+--------+--------------------1. 2 rows in set (0.07 sec)1. 1. mysql> ROLLBACK;1. Query OK, 0 rows affected (0.07 sec)

Cmo confirmar la transaccin actual? Si ha utilizado algunas sentencias DML actualizados algunos objetos de datos y usted quiere tener los cambios a ser registrados de forma permanente en la base de datos, puede utilizar el comando COMMIT. Har que todos los cambios de base de datos realizados en la transaccin actual volverse permanente y finalizar la transaccin actual. El siguiente ejercicio tutorial le muestra cmo usar COMMIT comandos:1. >\mysql\bin\mysql -u dev -piyf fyi1. 1. mysql> START TRANSACTION;1. Query OK, 0 rows affected (0.01 sec)1. 1. mysql> INSERT INTO fyi_links (url, id)1. VALUES ('fyicenter.com', 101);1. Query OK, 1 row affected (0.11 sec)1. 1. mysql> INSERT INTO fyi_links (url, id)1. VALUES ('centerfyi.com', 110);1. Query OK, 1 row affected (0.00 sec)1. 1. mysql> SELECT * FROM fyi_links;1. +-----+---------------+-------+--------+--------------------1. | id | url | notes | counts | created 1. +-----+---------------+-------+--------+--------------------1. | 101 | fyicenter.com | NULL | NULL | 2006-07-01 20:27:491. | 110 | centerfyi.com | NULL | NULL | 2006-07-01 20:28:101. +-----+---------------+-------+--------+--------------------1. 2 rows in set (0.07 sec)1. 1. mysql> COMMIT;1. Query OK, 0 rows affected (0.04 sec)Cmo deshacer la transaccin actual?Si ha utilizado algunas sentencias DML actualizados algunos objetos de datos, que encuentre un problema con esos cambios, y no desea que los cambios que se registran de forma permanente en la base de datos, puede utilizar el comando ROLLBACK. Se eliminarn todos los cambios de base de datos realizadas en la transaccin actual y finalizar la transaccin actual. El siguiente ejercicio tutorial le muestra cmo utilizar los comandos ROLLBACK:>\mysql\bin\mysql -u dev -piyf fyi

mysql> START TRANSACTION;Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO fyi_links (url, id) VALUES ('google.com', 102);Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO fyi_links (url, id) VALUES ('myspace.com', 103);Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | NULL | NULL | 2006-07-01 20:34:10| 102 | google.com | NULL | NULL | 2006-07-01 20:37:06| 103 | myspace.com | NULL | NULL | 2006-07-01 20:37:17| 110 | centerfyi.com | NULL | NULL | 2006-07-01 20:34:12+-----+---------------+-------+--------+--------------------4 rows in set (0.00 sec)

mysql> ROLLBACK;Query OK, 0 rows affected (0.08 sec)

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | NULL | NULL | 2006-07-01 20:27:49| 110 | centerfyi.com | NULL | NULL | 2006-07-01 20:28:10+-----+---------------+-------+--------+--------------------2 rows in set (0.07 sec)Como se puede ver, los dos nuevos registros insertados en la tabla fueron retirados por el comando ROLLBACK.Qu pasa con la transaccin actual si una transaccin START se ejecuta?Si usted est en un medio de una transaccin actual y se ejecuta un comando TRANSACCIN START, la transaccin actual se ha comprometido y termin. Todos los cambios de base de datos realizados en la transaccin actual se convertir en permanente. Esto se llama una implcita cometen por un comando START TRANSACTION.El siguiente ejercicio tutorial le muestra que el comando START TRANSACTION oblig a la transaccin actual que estar comprometido y termin. El comando ROLLBACK posterior no tuvo efectos sobre la transaccin cerrada:>\mysql\bin\mysql -u dev -piyf fyi

mysql> START TRANSACTION;Query OK, 0 rows affected (0.01 sec)

mysql> UPDATE fyi_links SET notes='Good', counts=999 WHERE id=101;Query OK, 1 row affected (0.11 sec)Rows matched: 1 Changed: 1 Warnings: 0

mysql> UPDATE fyi_links SET notes='Wrong', counts=0 WHERE id=110;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0

mysql> START TRANSACTION;Query OK, 0 rows affected (0.04 sec)

mysql> ROLLBACK;Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | Good | 999 | 2006-07-01 20:34:10| 110 | centerfyi.com | Wrong | 0 | 2006-07-01 20:34:12+-----+---------------+-------+--------+--------------------2 rows in set (0.00 sec)Qu pasa con la transaccin actual Si una declaracin DDL se ejecuta?Si se ejecuta una instruccin DDL, la transaccin actual se ha comprometido y termin. Todos los cambios de base de datos realizadas en la transaccin actual se convertir en permanente. Esto se llama una implcita comprometen por una sentencia DDL.El siguiente ejercicio tutorial te muestra que la sentencia CREATE TABLE oblig a la transaccin actual que estar comprometido y termin. El comando ROLLBACK posterior no tuvo efectos sobre la transaccin cerrada:>\mysql\bin\mysql -u dev -piyf fyi

mysql> START TRANSACTION;Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO fyi_links (url, id) VALUES ('oracle.com', 112);Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO fyi_links (url, id) VALUES ('mysql.com', 113);Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE fyi_temp AS (SELECT * FROM fyi_links);Query OK, 4 rows affected (0.22 sec)Records: 4 Duplicates: 0 Warnings: 0

mysql> ROLLBACK;Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | Good | 999 | 2006-07-01 20:34:10| 110 | centerfyi.com | Wrong | 0 | 2006-07-01 20:34:12| 112 | oracle.com | NULL | NULL | 2006-07-01 20:41:12| 113 | mysql.com | NULL | NULL | 2006-07-01 20:41:21+-----+---------------+-------+--------+--------------------Qu pasa con la transaccin actual Si la sesin se termina?Si se termina una sesin, la transaccin actual en esa sesin se retrotraer y termin. Se eliminarn todos los cambios de base de datos realizadas en la transaccin actual.Esto se llama una retrotraccin implcita cuando se termina la sesin.El siguiente ejercicio tutorial le muestra que el "dejar de fumar" fuerzas de comando la transaccin actual se retrotrae y termin. Cuando se vuelve a conectar la sesin, no ver los cambios realizados por las sentencias UPDATE en la sesin anterior:>\mysql\bin\mysql -u dev -piyf fyi

mysql> START TRANSACTION;Query OK, 0 rows affected (0.01 sec)

mysql> UPDATE fyi_links SET url = 'FYICENTER.COM' WHERE id = 101;Query OK, 1 row affected (0.01 sec)Rows matched: 1 Changed: 1 Warnings: 0

mysql> UPDATE fyi_links SET url = 'CENTERFYI.COM' WHERE id = 110;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0

mysql> quit;Bye

>\mysql\bin\mysql -u dev -piyf fyi

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | Good | 999 | 2006-07-01 20:34:10| 110 | centerfyi.com | Wrong | 0 | 2006-07-01 20:34:12| 112 | oracle.com | NULL | NULL | 2006-07-01 20:41:12| 113 | mysql.com | NULL | NULL | 2006-07-01 20:41:21+-----+---------------+-------+--------+--------------------4 rows in set (0.01 sec)

Qu pasa con la transaccin actual Si la sesin se mat?Si una sesin es asesinada por el DBA, la transaccin actual en esa sesin se retrotraer y termin. Se eliminarn todos los cambios de base de datos realizadas en la transaccin actual. Esto se llama una retrotraccin implcita cuando se mat sesin. El siguiente ejercicio tutorial te muestra que el comando KILL obliga a la transaccin actual que revertirse con todos los cambios:>\mysql\bin\mysql -u dev -piyf fyi

mysql> DELETE FROM fyi_links where id = 112;Query OK, 1 row affected (0.07 sec)

mysql> DELETE FROM fyi_links where id = 113;Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | Good | 999 | 2006-07-01 20:34:10| 110 | centerfyi.com | Wrong | 0 | 2006-07-01 20:34:12+-----+---------------+-------+--------+--------------------2 rows in set (0.01 sec)Keep the "dev" mysql window as is, and open another window to run another instance of mysql:>\mysql\bin\mysql -u root -pretneciyf

mysql> SHOW PROCESSLIST;+----+------+----------------+------+---------+------+------| Id | User | Host | db | Command | Time | State+----+------+----------------+------+---------+------+------| 3 | dev | localhost:4723 | fyi | Sleep | 171 | | 5 | root | localhost:4728 | fyi | Query | 0 | NULL+----+------+----------------+------+---------+------+------2 rows in set (0.08 sec)

mysql> KILL 3;Query OK, 0 rows affected (0.00 sec)Go back to the "dev" mysql window:mysql> COMMIT;ERROR 2006 (HY000): MySQL server has gone awayNo connection. Trying to reconnect...Connection id: 6Current database: fyiQuery OK, 0 rows affected (0.21 sec)

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | Good | 999 | 2006-07-01 20:34:10| 110 | centerfyi.com | Wrong | 0 | 2006-07-01 20:34:12| 112 | oracle.com | NULL | NULL | 2006-07-01 20:41:12| 113 | mysql.com | NULL | NULL | 2006-07-01 20:41:21+-----+---------------+-------+--------+--------------------4 rows in set (0.00 sec)Como se puede ver, dos registros eliminados se deshacen como la sesin fue asesinado por el DBA.Cmo maneja MySQL Leer consistencia?Leer la consistencia es un concepto que describe cmo coherente la salida ser en dos operaciones de lectura posteriores. Una operacin de lectura suele ser un independiente sentencia SELECT o una subconsulta SELECT en un comunicado de los padres.Un servidor de base de datos puede soportar hasta 3 niveles de consistencia de lectura: No Leer Consistencia - Dos operaciones de lectura posteriores tendrn ninguna salida coherente, si otras sesiones estn haciendo cambios a la base de datos. Declaracin Nivel Leer Consistencia - Dos operaciones de lectura posteriores tendrn una salida consistente, si se utilizan como subconsultas dentro de una nica sentencia SQL. Transaccin Nivel Leer Consistencia - Dos operaciones de lectura posteriores tendrn una salida consistente, si se utilizan como subconsultas o sentencias SELECT dentro de una sola transaccin.Por defecto, el servidor MySQL ofrece el ms alto nivel, Transaccin Nivel Leer Consistencia, en tablas con motores de almacenamiento transaccionales, como InnoDB.Cules son los niveles de aislamiento de transaccin?Existen 4 niveles de aislamiento de transacciones definidas por el estndar SQL-1992: READ UNCOMMITTED - Las sentencias SELECT en una transaccin leern cambios de datos no comprometidos de las transacciones de todas las sesiones conectadas. En este nivel, "lectura sucia" que podra suceder, donde transaccin A lee un registro de datos, incluyendo los cambios realizados por la transaccin B, pero no se comprometi an. READ COMMITTED - Las sentencias SELECT en una transaccin leern slo de datos los cambios confirmados de otras transacciones, y los cambios de datos comprometidas del mismo. En este nivel, "lectura sucia" no suceder. Pero "lectura no repetible" podra suceder, donde la transaccin A ejecuta la misma consulta dos veces y tiene dos salidas diferentes, porque la transaccin B cometi algunos cambios de datos entre las dos ejecuciones. REPEATABLE READ - Extendiendo el nivel READ COMMITTED cometidos para conseguir esa misma sentencia SELECT obtendr los mismos datos en los mismos registros si se ejecuta varias veces. Servidor de base de datos utilizar cerraduras o instantneas de datos para que esto suceda. En este nivel, "lectura sucia" y "lectura no repetible" no va a suceder. Sin embargo, "los registros fantasma" podra suceder, hay transaccin A ejecuta la misma consulta dos veces y obtiene registros adicionales del segundo tiempo, porque la transaccin B introduce algunos nuevos registros entre las dos ejecuciones. SERIALIZABLE - Extendiendo el nivel REPEATABLE READ para asegurar que "los registros fantasma" no va a suceder por el uso de cerraduras o instantneas de datos.Por defecto, el servidor MySQL ofrece el nivel REPEATABLE READ en tablas con motores de almacenamiento transaccionales, como InnoDB.Cmo ver y cambiar el actual nivel de aislamiento?Si quiere ver o cambiar el nivel de aislamiento actual, puede utilizar los siguientes comandos: SELECT@@TX_ISOLATION FROM DUAL; - Viendo el nivel de aislamiento actual. levelName SET TRANSACTION ISOLATION LEVEL; - Cambiar el nivel de aislamiento de la transaccin actual.El ejercicio tutorial muestra cmo ver y nivel de aislamiento de transaccin de cambio:>\mysql\bin\mysql -u dev -piyf fyi

mysql> SELECT @@TX_ISOLATION FROM DUAL;+-----------------+| @@TX_ISOLATION |+-----------------+| REPEATABLE-READ |+-----------------+1 row in set (0.46 sec)

mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;Query OK, 0 rows affected (0.10 sec)

mysql> SELECT @@TX_ISOLATION FROM DUAL;+----------------+| @@TX_ISOLATION |+----------------+| READ-COMMITTED |+----------------+1 row in set (0.02 sec)Cmo probar los niveles de aislamiento de transaccin?Si quieres poner a prueba los niveles de aislamiento de transaccin, es necesario asegurarse de que: Las tablas se crean con motores de almacenamiento transaccionales, como InnoDB. Las transacciones mltiples declaracin se inician con los comandos "START TRANSACTION" Comandos "SET TRANSACTION ISOLATION LEVEL" se utilizan para establecer el nivel de aislamiento adecuado.El ejercicio tutorial a continuacin muestra un buen ejemplo de probar el nivel de aislamiento de transaccin REPEATABLE-READ:>\mysql\bin\mysql -u dev -piyf fyi

mysql> START TRANSACTION;Query OK, 0 rows affected (0.00 sec)

mysql> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | Good | 999 | 2006-07-01 20:34:10| 110 | centerfyi.com | Wrong | 0 | 2006-07-01 20:34:12| 112 | oracle.com | NULL | NULL | 2006-07-01 20:41:12| 113 | mysql.com | NULL | NULL | 2006-07-01 20:41:21+-----+---------------+-------+--------+--------------------4 rows in set (0.00 sec)Keep the "dev" mysql window as is, and open another window to run another instance of mysql:>\mysql\bin\mysql -u dev -piyf fyi

mysql> DELETE FROM fyi_links WHERE id = 112;Query OK, 1 row affected (0.09 sec)

mysql> DELETE FROM fyi_links WHERE id = 113;Query OK, 1 row affected (0.25 sec)Go back to the first "dev" mysql window.mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | Good | 999 | 2006-07-01 20:34:10| 110 | centerfyi.com | Wrong | 0 | 2006-07-01 20:34:12| 112 | oracle.com | NULL | NULL | 2006-07-01 20:41:12| 113 | mysql.com | NULL | NULL | 2006-07-01 20:41:21+-----+---------------+-------+--------+--------------------4 rows in set (0.00 sec)

mysql> COMMIT;Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | Good | 999 | 2006-07-01 20:34:10| 110 | centerfyi.com | Wrong | 0 | 2006-07-01 20:34:12+-----+---------------+-------+--------+--------------------2 rows in set (0.00 sec)Como se puede ver que dos registros se eliminan de la segunda sesin entre dos ejecuciones de la misma sentencia SELECT en la primera sesin. Los registros eliminados seguan apareciendo en la salida hasta que la transaccin se concluy con la sentencia COMMIT.Qu es un bloqueo de datos?MySQL utiliza dos tipos de cerraduras de datos en dos niveles para proporcionarle el nivel de aislamiento que necesita: Compartir Bloqueo a nivel de fila (S) - Una fila de datos est bloqueado por una transaccin para la lectura. Bloqueo exclusivo en Fila Nivel (X) - Una fila de datos est bloqueado por una transaccin para actualizar y borrar. Intencin Compartir bloqueo en la tabla Nivel (ES): Una tabla de datos est bloqueado por una transaccin para la colocacin de las acciones bloqueos a nivel de fila. Intencin de bloqueo exclusivo en la tabla Nivel (IX): Una tabla de datos est bloqueado por una transaccin para la colocacin de bloqueo exclusivo a nivel de fila.Cmo Experimento datos Locks?Si usted quiere tener un poco de experiencia con las cerraduras de datos, puede crear dos ventanas corriendo dos transacciones mysql en dos sesiones. En la sesin 1, puede ejecutar una instruccin UPDATE con REPEATABLE READ nivel de aislamiento de transaccin para crear un bloqueo exclusivo. Antes de comprometerse sesin 1, cambiar a la sesin 2, y ejecutar un UPDATE en la misma fila como sesiones 1. La instruccin UPDATE se puso en estado de espera a causa del bloqueo de los datos. Siga el ejercicio tutorial de abajo para experimentar a ti mismo:(session 1)

>\mysql\bin\mysql -u dev -piyf fyi

mysql> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;Query OK, 0 rows affected (0.00 sec)

mysql> START TRANSACTION;Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM fyi_links;+-----+---------------+-------+--------+--------------------| id | url | notes | counts | created +-----+---------------+-------+--------+--------------------| 101 | fyicenter.com | Good | 999 | 2006-07-01 20:34:10| 110 | centerfyi.com | Wrong | 0 | 2006-07-01 20:34:12+-----+---------------+-------+--------+--------------------2 rows in set (0.00 sec)

mysql> UPDATE fyi_links SET url='FYICENTER.COM' WHERE id=101;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0

(Exclusive lock (X) placed on row id=101)Switch to session 2:(session 2)

>\mysql\bin\mysql -u dev -piyf fyi

mysql> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;Query OK, 0 rows affected (0.00 sec)

mysql> START TRANSACTION;Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE fyi_links SET notes='Best' where id=101;

(Blocked to wait for exclusive lock (X) on row id=101)Switch to back session 1:(session 1)

mysql> COMMIT;Query OK, 0 rows affected (0.05 sec)

(Exclusive lock (X) on row id=101 released)Switch to session 2:(session 2)

Query OK, 1 row affected (11.80 sec)Rows matched: 1 Changed: 1 Warnings: 0

(Got permission to update row id=101)Cunto tiempo una transaccin esperar un Data Lock?Si se emite una sentencia UPDATE o DELETE en una fila que tiene un bloqueo exclusivo propiedad de otra sesin, su estado de cuenta ser bloqueada que esperar a la otra sesin para liberar el bloqueo. Pero la espera ser tiempo de espera despus del perodo innodb_lock_wait_timeout predefinido, que est a 50 segundos de forma predeterminada.El ejercicio tutorial a continuacin muestra lo que suceder si una transaccin ha sido bloqueado y se ha alcanzado el perodo de tiempo de espera de bloqueo:(session 1)

mysql> START TRANSACTION;Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE fyi_links SET counts='777' where id=101;Query OK, 1 row affected (0.02 sec)Rows matched: 1 Changed: 1 Warnings: 0

(Exclusive lock (X) placed on row id=101)Switch to session 2:(session 2)

mysql> START TRANSACTION;Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE fyi_links SET counts=888 where id=101;

(Blocked to wait for exclusive lock (X) on row id=101)(50 seconds passed)

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction (Transaction terminated with a rollback)Qu pasa con sus transacciones Cuando ERROR Ocurri 1205?Si su transaccin recibe el "bloqueo de tiempo de espera excedido" - ERROR 1205, servidor MySQL termina automticamente su transaccin y deshace los cambios de datos de toda la transaccin. Por ello, los mensajes de error que dice que "intente reiniciar transaccin".Tenga en cuenta que el servidor MySQL no tocar la otra transaccin que mantiene el bloqueo. Eso significa que el bloqueo se mantendr como est. Si repite su transaccin de inmediato, se bloquear de nuevo, y puede ser programado de nuevo, si la otra transaccin no se ha cometido o se deshace todava.Qu es un Dead Lock?Un Dead Lock es un fenmeno que ocurre entre dos transacciones con cada uno de ellos la celebracin de una cerradura que bloquea la otra transaccin como se muestra en el siguiente diagrama:(transaction 1) (transaction 2)update row X to create lock 1 update row Y to create lock 2 update row X (blocked by lock 1)update row Y(blocked by lock 2)

(dead lock created)Cmo Experimento Dead Locks?Si usted quiere tener un poco de experiencia con las cerraduras muertas, puede crear dos ventanas que se ejecutan dos transacciones mysql en dos sesiones en el nivel de aislamiento REPEATABLE READ. A continuacin, ejecute algunas sentencias UPDATE como se muestra en el ejercicio tutorial a continuacin:(session 1)

mysql> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;Query OK, 0 rows affected (0.00 sec)

mysql> START TRANSACTION;Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE fyi_links SET notes='Lock1' where id=101;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0

(Exclusive lock (X) placed on row id=101)Switch to session 2:(session 2)

mysql> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;Query OK, 0 rows affected (0.00 sec)

mysql> START TRANSACTION;Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE fyi_links SET notes='Lock2' where id=110;Query OK, 1 row affected (0.10 sec)Rows matched: 1 Changed: 1 Warnings: 0

(Exclusive lock (X) placed on row id=110)

mysql> UPDATE fyi_links SET notes='Good1' where id=101;

(Blocked to wait for exclusive lock (X) on row id=101)Switch to session 1:(session 1)

mysql> UPDATE fyi_links SET notes='Good2' where id=110;

(Tried to wait for exclusive lock (X) row id=110)

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

(Transaction terminated with a rollback)Switch to session 2:(session 2)

(Exclusive lock (X) on row id=101 released)(Block is removed on this transaction is removed)

Query OK, 1 row affected (10.01 sec)Rows matched: 1 Changed: 1 Warnings: 0Qu pasa con sus transacciones Cuando ERROR Ocurri 1213?Si su transaccin recibe la "Deadlock encontr al intentar conseguir bloquear" - ERROR 1213, servidor MySQL termina automticamente su transaccin y deshace los cambios de datos de toda la transaccin. Por ello, los mensajes de error que dice que "intente reiniciar transaccin".Al mismo tiempo, las cerraduras de propiedad del (deshace) transaccin terminado se dar a conocer.Servidor MySQL no tocar la otra transaccin. Pero el bloque ser eliminado, ya que el bloqueo era dueo de la transaccin terminada se libera. La otra transaccin podr continuar normalmente.Tenga en cuenta que el servidor MySQL automticamente detecta bloqueos muertos y les resolvi mediante acciones de rollback.Cules son los impactos sobre Aplicaciones de Cerraduras, tiempos de espera, y los puntos muertos?Si est utilizando transacciones con REPEATABLE READ nivel de aislamiento y motores de almacenamiento seguro de las transacciones en las aplicaciones, las cerraduras de datos, los tiempos de espera de bloqueo, y las detecciones de bloqueo muertos afectar su aplicacin en un entorno multi-usuario concurrente como sitios web de varias maneras: Data Locks - Ayudar a su aplicacin a mantener la integridad de los datos y mantener cada sesin de usuario consistente. Pero cerraduras de datos tambin se ralentiza sus aplicaciones, ya que una sesin de usuario puede tener que esperar a que otras sesiones para liberar los bloqueos antes de continuar algunas operaciones de datos. Lock Timeouts - Ayudar a su aplicacin para evitar largas esperas y mejorar el tiempo de respuesta a las acciones del usuario. Pero el cdigo de aplicacin debe atrapar a los errores de tiempo de espera de bloqueo, y tratar con ellos adecuadamente, como pedirle a su usuario para cancelar y reiniciar el proceso. Dead Lock Detections - Ayudar a su aplicacin para evitar las sesiones de usuario muertas y mejorar el tiempo de respuesta a las acciones del usuario. Pero el cdigo de aplicacin debe atrapar a los errores de bloqueo de muertos, y tratar con ellos adecuadamente, como pedirle a su usuario para cancelar y reiniciar el proceso.