1
0
mirror of https://github.com/php/doc-es.git synced 2026-04-28 09:33:10 +02:00
Files
archived-doc-es/reference/pdo/transactions.xml
T
Pedro Antonio Gil Rodríguez f47a039bec Correcciones menores
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@336628 c90b9560-bf6c-de11-be94-00142212c4b1
2015-04-22 23:33:11 +00:00

144 lines
6.2 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: a56106f69198dfe88c6084593c78a71c26b24353 Maintainer: seros Status: ready -->
<!-- Reviewed: yes Maintainer: seros -->
<chapter xml:id="pdo.transactions" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Transacciones y autoconsigna ("auto-commit")</title>
<para>
Una vez realizada una conexión a través de PDO, es necesario comprender cómo PDO
gestiona las transacciones antes de comenzar a realizar consultas. Si no se
han manejado anteriormente transacciones, estas ofrecen cuatro características principales: Atomicidad,
Consistencia, Aislamiento y Durabilidad (ACID por sus siglas en inglés). En términos sencillos, se garantiza
que cualquier trabajo llevado a cabo en una transacción, incluso si se hace por etapas, sea
aplicado a la base de datos de forma segura, y sin interferencia
de otras conexiones, cuando sea consignado. El trabajo transaccional puede también
ser deshecho automáticamente bajo petición (siempre y cuando no se haya
consignado ya), lo que hace más sencillo el manejo de errores en los scripts.
</para>
<para>
Las transacciones son implementadas típicamente para hacer que el lote de
cambios se apliquen a la vez; esto tiene el buen efecto secundario de
mejorar drásticamente la eficiencia de las actualizaciones. En otras palabras,
las transacciones pueden hacer los scripts más rápidos y potencialmente más robustos
(aún así es necesario utilizarlas correctamente para obtener tal beneficio).
</para>
<para>
Desafortunadamente, no todas las bases de datos admiten transacciones, por lo que PDO necesita
ejecutarse en lo que es conocido como el modo "auto-commit" cuando se abra por primera vez la
conexión. El modo auto-commit significa que toda consulta que se ejecute tiene su
propia transacción implícita, si la base de datos la soporta, o ninguna transacción
si la base de datos no las soporta. Si fuera necesario el uso de transacciones,
se debe usar el método <function>PDO::beginTransaction</function> para
iniciar una. Si el controlador subyacente no admite transacciones, se lanzará
una PDOException (independientemente de la configuración del manejo de errores:
esto es siempre una condición de error serio). Una vez dentro de una transacción,
se puede utilizar <function>PDO::commit</function> o
<function>PDO::rollBack</function> para finalizarla, dependiendo del éxito del
código que se ejecute durante la transacción.
</para>
<warning>
<para>
PDO sólo comprueba la funcionalidad de transacciones a nivel del controlador. Si una
cierta condición durante la ejecución implica que las transacciones no estén disponibles,
<methodname>PDO::beginTransaction</methodname> seguirá devolviendo &true;
sin ningún error si el servidor de bases de datos acepta la solicitud de iniciar una
transacción.
</para>
<para>
Un ejemplo podría ser el intento de utilizar transacciones en tablas MyISAM en
una base de datos MySQL.
</para>
</warning>
<para>
Cuando el script finaliza o cuando una conexión está a punto de ser cerrada, si
existe una transacción pendiente, PDO la revertirá automáticamente.
Esto es una medida de seguridad que ayuda a evitar inconsistencia en los casos donde
el script finaliza inesperadamente (si se no consignó la
transacción, se asume que algo salió mal, con lo cual se realiza la reversión
para la seguridad de los datos).
</para>
<warning>
<para>
La reversión automática sólo ocurre si se inicia una transacción a través de
<function>PDO::beginTransaction</function>. Si se ejecuta manualmente una
consulta que inicie una transacción, PDO no tiene forma de saber algo sobre la misma y,
por tanto, no puede revertirla si algo saliera mal.
</para>
</warning>
<para>
<example><title>Ejecución de un lote en una transacción</title>
<para>
En el siguiente ejemplo, se asume que se ha creado un conjunto de
entradas para un nuevo empleado, al cual se le ha asignado el número de ID 23.
Además de introducir los datos básicos de una persona, también es necesario
registrar su sueldo. Es bastante simple realizar dos actualizaciones independientes,
pero realizándolas entre las llamadas a
<function>PDO::beginTransaction</function> y
<function>PDO::commit</function>, se garantiza que nadie más
será capaz de ver los cambios hasta que se hayan completado. Si
algo sale mal, el bloque catch revierte los cambios realizados
desde que se creó la transacción, y luego imprime un mensaje de
error.
</para>
<programlisting role="php">
<![CDATA[
<?php
try {
$mbd = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2',
array(PDO::ATTR_PERSISTENT => true));
echo "Conectado\n";
} catch (Exception $e) {
die("No se pudo conectar: " . $e->getMessage());
}
try {
$mbd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$mbd->beginTransaction();
$mbd->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
$mbd->exec("insert into salarychange (id, amount, changedate)
values (23, 50000, NOW())");
$mbd->commit();
} catch (Exception $e) {
$mbd->rollBack();
echo "Fallo: " . $e->getMessage();
}
?>
]]>
</programlisting>
</example>
</para>
<para>
No exite límite al realizar actualizaciones en una transacción. También es posible
ejecutar consultas complejas para extraer datos, con al posibilidad de utilizar esa información para
construir más actualizaciones y consultas; mientras que la transacción esté activa,
se garantiza que nadie más pueda realizar cambios mientras se esté en mitad del
trabajo. Para más información sobre transacciones, consulte la
documentación proporcionada por su servidor de base de datos.
</para>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->