2012-05-14 23 views
6

Tengo una pregunta con respecto a las confirmaciones y transacciones de mysql.commit y transacción mysql

Tengo un par de declaraciones de php que ejecutan consultas de mysql.

¿Acabo de decir lo siguiente?

mysql_query("START TRANSACTION"); 
//more queries here 
mysql_query("COMMIT"); 

¿Qué haría exactamente esto? ¿Cómo ayuda? Para actualizaciones, eliminaciones e inserciones También encontraron esta bloquear otras consultas de lectura:

mysql_query("LOCK TABLES t1 WRITE, t2 WRITE"); 
//more queries here 
mysql_query("UNLOCK TABLES t1, t2"); 

sería este bloque de otras consultas cualquiera que sea la naturaleza o sólo escribe/selecciona?

Otra pregunta: Supongamos que se está ejecutando una consulta y bloquea otras consultas. Otra consulta intenta acceder a datos bloqueados y ve que está bloqueado. ¿Cómo procede? ¿Espera hasta que los datos se desbloquean nuevamente y vuelve a ejecutar la consulta? ¿Simplemente falla y debe repetirse? Si es así, ¿cómo puedo verificar?

¡Muchas gracias!

Dennis

+0

¿Está utilizando tablas InnoDB o MyISAM? – Daan

+0

@Daan Yo uso InnoDB – weltschmerz

Respuesta

12

En InnoDB, no es necesario para iniciar de manera explícita o transacciones finales para consultas individuales si no ha cambiado la configuración predeterminada de confirmación automática, que es "sobre". Si autocommit está activado, InnoDB automáticamente incluye cada consulta SQL en una transacción, que es el equivalente de START TRANSACTION; query; COMMIT;.

Si utiliza explícitamente START TRANSACTION en InnoDB con confirmación automática activada, todas las consultas ejecutadas después de una declaración START TRANSACTION se ejecutarán o todas fallarán. Esto es útil en entornos bancarios, por ejemplo: si estoy transfiriendo $ 500 a su cuenta bancaria, esa operación solo tendrá éxito si la suma se ha restado de mi saldo bancario y se ha agregado al suyo. Así pues, en este caso, que había corrido algo así como

START TRANSACTION; 
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan'; 
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis'; 
COMMIT; 

este modo se garantiza que, o bien ambas consultas se ejecutarán correctamente, o ninguno, pero no sólo uno. This post tiene más información sobre cuándo debe usar las transacciones.

En InnoDB, muy rara vez tendrá que bloquear tablas completas; InnoDB, a diferencia de MyISAM, admite el bloqueo a nivel de fila. Esto significa que los clientes no tienen que bloquear toda la tabla, lo que obliga a otros clientes a esperar. Los clientes solo deben bloquear las filas que realmente necesitan, permitiendo que otros clientes continúen accediendo a las filas que necesitan.

Puede leer más sobre las transacciones InnoDB here. Sus preguntas sobre el bloqueo se responden en las secciones 14.2.8.8 y 14.2.8.9 de los documentos. Si una consulta falla, su controlador MySQL devolverá un mensaje de error que indica el motivo; su aplicación debería volver a enviar las consultas si es necesario.

Finalmente, en su código de ejemplo, utilizó mysql_query. Si está escribiendo un código nuevo, deje de usar la antigua, lenta y obsoleta biblioteca mysql_ para PHP y use mysqli_ o PDO en su lugar :)

+0

impresionante, ¡gracias! entonces InnoDB automáticamente solo bloquea filas? ¿Y cómo puedo verificar si mi mesa ha confirmado automáticamente?y cómo puedo establecer un índice en él (estoy usando phpmyadmin) – weltschmerz

+0

Puede emitir una consulta 'SHOW VARIABLES LIKE 'autocommit'', o hacer clic en' variables' en la página de inicio de phpMyAdmin. La creación de un índice se realiza yendo a la base de datos y la tabla de apropiación, haciendo clic en 'estructura' y usando el formulario que se ve allí para crear un índice. O puede emitir sentencias SQL, p. 'Tabla ALTER TABLE ADD INDEX (campo)'. No estoy seguro de lo que quiere decir con "InnoBD bloquea filas automáticamente", ciertamente nunca bloqueará automáticamente una tabla completa, si eso es lo que quiere decir :) – Daan

+0

Autocommit is on :) ¿Las claves principales siempre sirven como índice? Tengo claves principales en mis tablas y quería agregar un índice, pero decía que solo podía ser la misma que la clave principal ... – weltschmerz

Cuestiones relacionadas