Curso de MariaDB Desde la Consola/Transcacciones

De WikiCabal
Ir a la navegación Ir a la búsqueda

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

  1 MariaDB [Prueba1]> SET autocommit=0;
  2 Query OK, 0 rows affected (0.00 sec)
  3 
  4 MariaDB [Prueba1]> SELECT * from Usuarios;
  5 +----+----------+-------+
  6 | ID | Nombre   | Curso |
  7 +----+----------+-------+
  8 |  1 | Ana      |     2 |
  9 |  2 | Roberto  |     1 |
 10 |  3 | Angel    |     5 |
 11 |  4 | Laura    |     3 |
 12 |  5 | Ricardo  |     4 |
 13 |  6 | Mia      |     2 |
 14 |  7 | Leo      |     4 |
 15 |  8 | Mauricio |  NULL |
 16 +----+----------+-------+
 17 9 rows in set (0.00 sec)
 18 
 19 MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Adrian', 4 );
 20 Query OK, 1 row affected (0.04 sec)
 21 
 22 MariaDB [Prueba1]> SELECT * from Usuarios;
 23 +----+----------+-------+
 24 | ID | Nombre   | Curso |
 25 +----+----------+-------+
 26 |  1 | Ana      |     2 |
 27 |  2 | Roberto  |     1 |
 28 |  3 | Angel    |     5 |
 29 |  4 | Laura    |     3 |
 30 |  5 | Ricardo  |     4 |
 31 |  6 | Mia      |     2 |
 32 |  7 | Leo      |     4 |
 33 |  8 | Mauricio |  NULL |
 34 | 11 | Adrian   |     4 |
 35 +----+----------+-------+
 36 9 rows in set (0.00 sec)
 37 
 38 MariaDB [Prueba1]> quit
 39 Bye
 40 
 41 [rrc@Pwyr ~]$ mysql -u rrc -p
 42 Enter password: 
 43 
 44 Welcome to the MariaDB monitor.  Commands end with ; or \g.
 45 Your MariaDB connection id is 6
 46 Server version: 10.0.24-MariaDB Mageia MariaDB Server
 47 
 48 Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
 49 
 50 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 51 
 52 MariaDB [(none)]> use Prueba1;
 53 Database changed
 54 
 55 MariaDB [Prueba1]> SELECT * from Usuarios;
 56 +----+----------+-------+
 57 | ID | Nombre   | Curso |
 58 +----+----------+-------+
 59 |  1 | Ana      |     2 |
 60 |  2 | Roberto  |     1 |
 61 |  3 | Angel    |     5 |
 62 |  4 | Laura    |     3 |
 63 |  5 | Ricardo  |     4 |
 64 |  6 | Mia      |     2 |
 65 |  7 | Leo      |     4 |
 66 |  8 | Mauricio |  NULL |
 67 +----+----------+-------+
 68 8 rows in set (0.00 sec)
 69 
 70 MariaDB [Prueba1]> SET autocommit=0;
 71 Query OK, 0 rows affected (0.00 sec)
 72 
 73 MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Adrian', 4 );
 74 Query OK, 1 row affected (0.02 sec)
 75 
 76 MariaDB [Prueba1]> commit;
 77 Query OK, 0 rows affected (0.10 sec)
 78 
 79 MariaDB [Prueba1]> SELECT * from Usuarios;
 80 +----+----------+-------+
 81 | ID | Nombre   | Curso |
 82 +----+----------+-------+
 83 |  1 | Ana      |     2 |
 84 |  2 | Roberto  |     1 |
 85 |  3 | Angel    |     5 |
 86 |  4 | Laura    |     3 |
 87 |  5 | Ricardo  |     4 |
 88 |  6 | Mia      |     2 |
 89 |  7 | Leo      |     4 |
 90 |  8 | Mauricio |  NULL |
 91 | 12 | Adrian   |     4 |
 92 +----+----------+-------+
 93 9 rows in set (0.00 sec)
 94 
 95 MariaDB [Prueba1]> quit;
 96 Bye
 97 
 98 [rrc@Pwyr ~]$ mysql -u rrc -p
 99 Enter password: 
100 
101 Welcome to the MariaDB monitor.  Commands end with ; or \g.
102 Your MariaDB connection id is 7
103 Server version: 10.0.24-MariaDB Mageia MariaDB Server
104 
105 Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
106 
107 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
108 
109 MariaDB [(none)]> use Prueba1;
110 Database changed
111 
112 MariaDB [Prueba1]> SELECT * from Usuarios;
113 +----+----------+-------+
114 | ID | Nombre   | Curso |
115 +----+----------+-------+
116 |  1 | Ana      |     2 |
117 |  2 | Roberto  |     1 |
118 |  3 | Angel    |     5 |
119 |  4 | Laura    |     3 |
120 |  5 | Ricardo  |     4 |
121 |  6 | Mia      |     2 |
122 |  7 | Leo      |     4 |
123 |  8 | Mauricio |  NULL |
124 | 12 | Adrian   |     4 |
125 +----+----------+-------+
126 9 rows in set (0.00 sec)
127 
128 +----+----------+-------+
129 9 rows in set (0.00 sec)
130 
131 MariaDB [Prueba1]> select * from Cursos;
132 +----+------------+
133 | ID | Nombre     |
134 +----+------------+
135 |  1 | HTML5      |
136 |  2 | CSS3       |
137 |  3 | JavaScript |
138 |  4 | PHP        |
139 |  5 | MariaDB    |
140 |  6 | Python     |
141 +----+------------+
142 6 rows in set (0.00 sec)
143 
144 MariaDB [Prueba1]> MariaDB [Prueba1]> SET autocommit = 0;
145 Query OK, 0 rows affected (0.00 sec)
146 
147 MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Hector', 22 );
148 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`))
149 
150 MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Hector', 2 );
151 Query OK, 1 row affected (0.00 sec)
152 
153 WHOOOOOooooops No Quero CSS3, Quero PHP
154 
155 MariaDB [Prueba1]> SELECT * from Usuarios;
156 +----+----------+-------+
157 | ID | Nombre   | Curso |
158 +----+----------+-------+
159 |  1 | Ana      |     2 |
160 |  2 | Roberto  |     1 |
161 |  3 | Angel    |     5 |
162 |  4 | Laura    |     3 |
163 |  5 | Ricardo  |     4 |
164 |  6 | Mia      |     2 |
165 |  7 | Leo      |     4 |
166 |  8 | Mauricio |  NULL |
167 | 12 | Adrian   |     4 |
168 | 14 | Hector   |     2 |
169 +----+----------+-------+
170 10 rows in set (0.00 sec)
171 
172 MariaDB [Prueba1]> rollback;
173 Query OK, 0 rows affected (0.37 sec)
174 
175 MariaDB [Prueba1]> SELECT * from Usuarios;
176 +----+----------+-------+
177 | ID | Nombre   | Curso |
178 +----+----------+-------+
179 |  1 | Ana      |     2 |
180 |  2 | Roberto  |     1 |
181 |  3 | Angel    |     5 |
182 |  4 | Laura    |     3 |
183 |  5 | Ricardo  |     4 |
184 |  6 | Mia      |     2 |
185 |  7 | Leo      |     4 |
186 |  8 | Mauricio |  NULL |
187 | 12 | Adrian   |     4 |
188 +----+----------+-------+
189 9 rows in set (0.00 sec)
190 
191 MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Hector', 4 );
192 Query OK, 1 row affected (0.00 sec)
193 
194 MariaDB [Prueba1]> SELECT * from Usuarios;
195 +----+----------+-------+
196 | ID | Nombre   | Curso |
197 +----+----------+-------+
198 |  1 | Ana      |     2 |
199 |  2 | Roberto  |     1 |
200 |  3 | Angel    |     5 |
201 |  4 | Laura    |     3 |
202 |  5 | Ricardo  |     4 |
203 |  6 | Mia      |     2 |
204 |  7 | Leo      |     4 |
205 |  8 | Mauricio |  NULL |
206 | 12 | Adrian   |     4 |
207 | 15 | Hector   |     4 |
208 +----+----------+-------+
209 10 rows in set (0.00 sec)
210 
211 MariaDB [Prueba1]> commit;
212 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.
 1 MariaDB [Prueba1]> SET autocommit = 1;
 2 Query OK, 0 rows affected (0.00 sec)
 3 
 4 MariaDB [Prueba1]> START TRANSACTION;
 5 Query OK, 0 rows affected (0.00 sec)
 6 
 7 MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Roberto', 5 );
 8 Query OK, 1 row affected (0.02 sec)
 9 
10 MariaDB [Prueba1]> SELECT * from Usuarios;
11 +----+----------+-------+
12 | ID | Nombre   | Curso |
13 +----+----------+-------+
14 |  1 | Ana      |     2 |
15 |  2 | Roberto  |     1 |
16 |  3 | Angel    |     5 |
17 |  4 | Laura    |     3 |
18 |  5 | Ricardo  |     4 |
19 |  6 | Mia      |     2 |
20 |  7 | Leo      |     4 |
21 |  8 | Mauricio |  NULL |
22 | 12 | Adrian   |     4 |
23 | 15 | Hector   |     4 |
24 | 16 | Roberto  |     5 |
25 +----+----------+-------+
26 11 rows in set (0.00 sec)
27 
28 MariaDB [Prueba1]> quit;
29 Bye
30 
31 [rrc@Pwyr ~]$ mysql -u rrc -p
32 Enter password: 
33 
34 Welcome to the MariaDB monitor.  Commands end with ; or \g.
35 Your MariaDB connection id is 8
36 Server version: 10.0.24-MariaDB Mageia MariaDB Server
37 
38 Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
39 
40 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
41 
42 MariaDB [(none)]> use Prueba1;
43 Database changed
44 
45 MariaDB [Prueba1]> SELECT * from Usuarios;
46 +----+----------+-------+
47 | ID | Nombre   | Curso |
48 +----+----------+-------+
49 |  1 | Ana      |     2 |
50 |  2 | Roberto  |     1 |
51 |  3 | Angel    |     5 |
52 |  4 | Laura    |     3 |
53 |  5 | Ricardo  |     4 |
54 |  6 | Mia      |     2 |
55 |  7 | Leo      |     4 |
56 |  8 | Mauricio |  NULL |
57 | 12 | Adrian   |     4 |
58 | 15 | Hector   |     4 |
59 +----+----------+-------+
60 10 rows in set (0.00 sec)
61 
62 MariaDB [Prueba1]> START TRANSACTION;
63 Query OK, 0 rows affected (0.00 sec)
64 
65 MariaDB [Prueba1]> insert into Usuarios values ( NULL, 'Roberto', 5 );Query OK, 1 row affected (0.21 sec)
66 
67 MariaDB [Prueba1]> Commit;
68 Query OK, 0 rows affected (0.09 sec)