Curso de MariaDB Desde la Consola/Transcacciones

De WikiCabal
Saltar a: navegación, buscar

Transacciones

MariaDB [Prueba1]> show create table Cursos;
+--------+--------------------------------------------------------------------+
| Table  | Create Table                                                       |
+--------+--------------------------------------------------------------------+
| Cursos | CREATE TABLE `Cursos` (
  `ID` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `Nombre` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+--------+--------------------------------------------------------------------+
1 row in set (0.06 sec)

MariaDB [Prueba1]> show create table Usuarios;
+----------+------------------------------------------------------------------+
| Table    | Create Table                                                     |
+----------+------------------------------------------------------------------+
| Usuarios | CREATE TABLE `Usuarios` (
  `ID` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `Nombre` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `Curso` smallint(5) unsigned DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `Curso` (`Curso`),
  CONSTRAINT `Usuarios_ibfk_1` FOREIGN KEY (`Curso`) REFERENCES `Cursos` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+----------+------------------------------------------------------------------+
1 row in set (0.19 sec)

SET autocommit

MariaDB [Prueba1]> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
+----+----------+-------+
9 rows in set (0.00 sec)

MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Adrian', 4 );
Query OK, 1 row affected (0.04 sec)

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
| 11 | Adrian   |     4 |
+----+----------+-------+
9 rows in set (0.00 sec)

MariaDB [Prueba1]> quit
Bye

[rrc@Pwyr ~]$ mysql -u rrc -p
Enter password: 

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 10.0.24-MariaDB Mageia MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use Prueba1;
Database changed

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
+----+----------+-------+
8 rows in set (0.00 sec)

MariaDB [Prueba1]> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)

MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Adrian', 4 );
Query OK, 1 row affected (0.02 sec)

MariaDB [Prueba1]> commit;
Query OK, 0 rows affected (0.10 sec)

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
| 12 | Adrian   |     4 |
+----+----------+-------+
9 rows in set (0.00 sec)

MariaDB [Prueba1]> quit;
Bye

[rrc@Pwyr ~]$ mysql -u rrc -p
Enter password: 

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 10.0.24-MariaDB Mageia MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use Prueba1;
Database changed

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
| 12 | Adrian   |     4 |
+----+----------+-------+
9 rows in set (0.00 sec)

+----+----------+-------+
9 rows in set (0.00 sec)

MariaDB [Prueba1]> select * from Cursos;
+----+------------+
| ID | Nombre     |
+----+------------+
|  1 | HTML5      |
|  2 | CSS3       |
|  3 | JavaScript |
|  4 | PHP        |
|  5 | MariaDB    |
|  6 | Python     |
+----+------------+
6 rows in set (0.00 sec)

MariaDB [Prueba1]> MariaDB [Prueba1]> SET autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Hector', 22 );
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`Prueba1`.`Usuarios`, CONSTRAINT `Usuarios_ibfk_1` FOREIGN KEY (`Curso`) REFERENCES `Cursos` (`ID`))

MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Hector', 2 );
Query OK, 1 row affected (0.00 sec)

WHOOOOOooooops No Quero CSS3, Quero PHP

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
| 12 | Adrian   |     4 |
| 14 | Hector   |     2 |
+----+----------+-------+
10 rows in set (0.00 sec)

MariaDB [Prueba1]> rollback;
Query OK, 0 rows affected (0.37 sec)

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
| 12 | Adrian   |     4 |
+----+----------+-------+
9 rows in set (0.00 sec)

MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Hector', 4 );
Query OK, 1 row affected (0.00 sec)

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
| 12 | Adrian   |     4 |
| 15 | Hector   |     4 |
+----+----------+-------+
10 rows in set (0.00 sec)

MariaDB [Prueba1]> commit;
Query OK, 0 rows affected (0.10 sec)

Start Transaction

Syntax

START TRANSACTION [transaction_property [, transaction_property] ...] | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1}

transaction_property:
    WITH CONSISTENT SNAPSHOT
  | READ WRITE
  | READ ONLY

Descripción

El START TRANSACTION o BEGIN inicia una nueva transacción. 

COMMIT confirma la transacción actual, por lo que sus cambios
sean permanentes. 

ROLLBACK deshace la transacción actual, cancelar sus cambios. 
La sentencia SET autocommit desactiva o activa el modo de commit
automática para la sesión actual.

La palabra opcional TRABAJO es compatible con COMMIT y ROLLBACK,
como son las cláusulas de CHAIN y RELEASE. CHAIN y RELEASE se pueden
utilizar para un control adicional sobre la finalización de la
transacción. El valor de la variable de sistema completion_type determina
el comportamiento de finalización predeterminado.

La cláusula AND CHAIN causa una nueva transacción para comenzar
tan pronto como termine el actual, y la nueva transacción tiene
el mismo nivel de aislamiento ya que la transacción simplemente
terminado. La cláusula RELEASE hace que el servidor de desconectar
la sesión actual del cliente después de terminar la transacción
actual. Incluyendo la palabra NO suprime CHAIN y RELEASE lo cual
puede ser útil si la variable de sistema completion_type se establece
en el encadenamiento de causar CHAINing o RELEASE finalización de
forma predeterminada.

Modo de acceso

Estas cláusulas aparecieron en MariaDB 10.0.

El modo de acceso especifica si se permite que la transacción para
escribir datos o no. De forma predeterminada, las transacciones son
en modo READ WRITE (véase la variable de sistema tx_read_only). el modo de
READ ONLY permite que el motor de almacenamiento para aplicar
optimizaciones que no se pueden utilizar para las operaciones que
escriben datos. La única excepción a esta regla es la registrada
sólo las transacciones pueden llevar a cabo sentencias DDL en
tablas temporales.

No está permitido especificar tanto READ WRITE y READ ONLY en el
mismo comunicado.

READ WRITE  y READ ONLY también puede especificarse en la sentencia
SET TRANSACTION, en cuyo caso el modo especificado es válido para 
todas las sesiones, o para toda transacción posterior utilizado por
la sesión actual.

autocommit

De forma predeterminada, MariaDB se ejecuta con el modo de confirmación
automática habilitada. Esto significa que tan pronto como se ejecuta 
una sentencia que actualice (modifique) una table, tiendas MariaDB
la actualización en el disco para que sea permanente. Para desactivar
el modo de autocommit, utilice la siguiente instrucción:

SET autocommit = 0;

Después de desactivar el modo de autocommit estableciendo la variable
de autocommit a cero, los cambios en tablas transaccionales (como los
de InnoDB o NDBCLUSTER) no se hacen permanentes inmediatamente. Debe
usar COMMIT para almacenar los cambios en disco o ROLLBACK para ignorar
los cambios.

Para desactivar el modo de autocommit para una serie única de comandos,
utilice la instrucción START TRANSACTION.

DDL

Comandos DDL (CREATE, ALTER, DROP) y las declaraciones administrativas
(FLUSH, RESET, OPTIMIZE, ANALYZE, CHECK, REPAIR, CACHE INDEX), y 
LOAD DATA INFILE, causan un COMMIT implícito y empezar una nueva transacción.
Una excepción a esta regla son el DDL que operan en tablas temporales:
se pueden CREATE, ALTER y DROP sin causar ningún COMMIT, pero esas acciones
no se puede ROLLBACK. Esto significa que si usted llama ROLLBACK, las tablas
temporales que ha creado en la transacción se mantendrán,
mientras que el resto de la transacción se ROLLBACK.

Transacciones no se pueden utilizar en STORED FUNCTIONS o TRIGGERS.
BEGIN ne se permite en STORED PROCEEDURES y EVENTS, por lo que debe
utilizar START TRANSACTION.

Una transacción adquiere un bloqueo de metadatos en cada tabla tiene
acceso para evitar que otras conexiones de alterar su estructura. El
bloqueo se libera al final de la transacción. Esto sucede incluso
con motores de almacenamiento no transaccionales (como MEMORY o CONNECT),
por lo que tiene sentido utilizar transacciones con tablas no transaccionales.
in_transaction

La variable de sistema in_transaction apareció en MariaDB 5.3.

WITH CONSISTENT SNAPSHOT

La opción WITH CONSISTENT SNAPSHOT inicia una lectura consistente en motores
de almacenamiento tales como XtraDB e InnoDB que puedan hacerlo, lo mismo que
si se emitió una TRANSACCIÓN START seguida de un SELECT desde cualquier tabla InnoDB.

MariaDB 5.3 introduce mejoras para esta función. Mejoras para START TRANSACTION WITH CONSISTENT SNAPSHOT.
MariaDB [Prueba1]> SET autocommit = 1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [Prueba1]> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Roberto', 5 );
Query OK, 1 row affected (0.02 sec)

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
| 12 | Adrian   |     4 |
| 15 | Hector   |     4 |
| 16 | Roberto  |     5 |
+----+----------+-------+
11 rows in set (0.00 sec)

MariaDB [Prueba1]> quit;
Bye

[rrc@Pwyr ~]$ mysql -u rrc -p
Enter password: 

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.0.24-MariaDB Mageia MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use Prueba1;
Database changed

MariaDB [Prueba1]> SELECT * from Usuarios;
+----+----------+-------+
| ID | Nombre   | Curso |
+----+----------+-------+
|  1 | Ana      |     2 |
|  2 | Roberto  |     1 |
|  3 | Angel    |     5 |
|  4 | Laura    |     3 |
|  5 | Ricardo  |     4 |
|  6 | Mia      |     2 |
|  7 | Leo      |     4 |
|  8 | Mauricio |  NULL |
| 12 | Adrian   |     4 |
| 15 | Hector   |     4 |
+----+----------+-------+
10 rows in set (0.00 sec)

MariaDB [Prueba1]> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Roberto', 5 );Query OK, 1 row affected (0.21 sec)

MariaDB [Prueba1]> Commit;
Query OK, 0 rows affected (0.09 sec)