Curso de MariaDB Desde la Consola/Transcacciones
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)