Realmente no he encontrado un ejemplo normal de archivo PHP donde se usan transacciones MySQL. ¿Me puede mostrar un ejemplo simple de eso?
Y una pregunta más. Ya hice mucha programación y no utilicé transacciones. ¿Puedo poner una función PHP o algo header.php
así si una mysql_query
falla, entonces las otras también?
Creo que lo he descubierto, ¿es correcto ?:
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");
if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}
php
mysql
transactions
buena noches
fuente
fuente
mysql_query("BEGIN");
lugar de secuenciamysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
mysql_*
funciones en código nuevo . Ya no se mantienen y están oficialmente en desuso . ¿Ves el cuadro rojo ? Aprenda sobre las declaraciones preparadas y use PDO o MySQLi ; este artículo le ayudará a decidir cuál. Si elige PDO, aquí hay un buen tutorial .mysql
muere a pesar de estar en desuso, estará disponible en PECL para siempre.mysql
Respuestas:
La idea que generalmente uso cuando trabajo con transacciones se ve así (semi-pseudocódigo) :
Tenga en cuenta que, con esta idea, si una consulta falla, se debe lanzar una excepción:
PDO::setAttribute
PDO::ATTR_ERRMODE
yPDO::ERRMODE_EXCEPTION
Desafortunadamente, no hay magia involucrada. No puede simplemente colocar una instrucción en algún lugar y hacer que las transacciones se realicen automáticamente: aún debe especificar qué grupo de consultas debe ejecutarse en una transacción.
Por ejemplo, con bastante frecuencia tendrá un par de consultas antes de la transacción (antes de
begin
) y otro par de consultas después de la transacción (después de cualquieracommit
orollback
) y querrá que esas consultas se ejecuten sin importar lo que sucedió (o no) en la transacción.fuente
$db
tipo aquí? mysqli?PDOException
e incluso verificar valores de excepción si es necesario. us2.php.net/PDOExceptionCreo que lo he descubierto, ¿es correcto ?:
fuente
fuente
Como este es el primer resultado en Google para la "transacción php mysql", pensé en agregar una respuesta que explícitamente demuestre cómo hacer esto con mysqli (como el autor original quería ejemplos). Aquí hay un ejemplo simplificado de transacciones con PHP / mysqli:
Además, tenga en cuenta que PHP 5.5 tiene un nuevo método mysqli :: begin_transaction . Sin embargo, esto no ha sido documentado aún por el equipo de PHP, y todavía estoy atascado en PHP 5.3, por lo que no puedo comentarlo.
fuente
$conn->autocommit(FALSE)
, en el ejemplo anterior, solo afecta a la conexión individual, no tiene ningún efecto en ninguna otra conexión a la base de datos.if (!result)
, debería hacerloif (result === false)
, si la consulta es capaz de devolver un resultado válido que se evaluaría como falso o cero.Compruebe qué motor de almacenamiento está utilizando. Si es MyISAM, entonces
Transaction('COMMIT','ROLLBACK')
no será compatible porque solo el motor de almacenamiento InnoDB, no MyISAM, admite transacciones.fuente
Al usar la conexión PDO:
A menudo uso el siguiente código para la gestión de transacciones:
Ejemplo de uso:
De esta manera, el código de gestión de transacciones no se duplica en todo el proyecto. Lo cual es bueno, porque, a juzgar por otras respuestas relacionadas con PDO en este hilo, es fácil cometer errores en él. Los más comunes son olvidar volver a lanzar la excepción y comenzar la transacción dentro del
try
bloque.fuente
Hice una función para obtener un vector de consultas y hacer una transacción, tal vez alguien lo encuentre útil:
fuente
Tenía esto, pero no estoy seguro si esto es correcto. Podría probar esto también.
Idea de aquí: http://www.phpknowhow.com/mysql/transactions/
fuente
mysql_query
, en lugar de usarlomysqli
, aunque se vincula a un tutorial que lo usamysqli
. En mi humilde opinión, debe eliminar este mal ejemplo, o reemplazarlo para usar el código como está escrito en el tutorial phpknowhow.Un ejemplo más de estilo de procedimiento con
mysqli_multi_query
, asume que$query
está lleno de declaraciones separadas por punto y coma.fuente
mysqli_multi_query
. Cualquier persona interesada en eso debería buscar en Google en otro lugar por ejemplo más limpio.