2009-08-15 16 views
5

¿Cómo puedo iniciar una transacción cuando hay algún error en las sentencias de SQL que el sistema revertirá automáticamente?Transaction MySQL

tengo la siguiente instrucción SQL

START TRANSACTION; 

BEGIN; 

INSERT INTO `users`(id,name,gender,email,age) 
    VALUES(11121,'sss',0,'ssss',22); 

INSERT INTO `teachers`(`UserId`,`teachingSubject`) 
    VALUES(11121,300); 

COMMIT; 

No rollback cuando la segunda declaración contrarrestar un error. ¿Por qué? el 'teachingSubject' es TINYINT (2), la segunda instrucción se ejecutará fuera de su rango. Quiero deshacer todas las declaraciones.

Below is my procedure. 

mysql> source d:\s.sql 
Query OK, 0 rows affected (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

Query OK, 1 row affected (0.00 sec) 

ERROR 1264 (22003): Out of range value for column 'te 
Query OK, 0 rows affected (0.09 sec) 

mysql> SELECT * FROM teachers 
    -> ; 
+--------+-----------------+ 
| UserId | teachingSubject | 
+--------+-----------------+ 
| 11111 |    1 | 
| 11112 |    9 | 
| 11113 |    100 | 
+--------+-----------------+ 
3 rows in set (0.00 sec) 

mysql> SELECT * FROM users; 
+-------+--------+--------+----------------+------+ 
| id | name | gender | email   | age | 
+-------+--------+--------+----------------+------+ 
| 11111 | Killer |  | [email protected]  | 12 | 
| 11112 | sss |  | ssss   | 22 | 
| 11113 | sss |  | ssss   | 22 | 
| 11114 | sss |  | ssss   | 22 | 
| 11115 | sss |  | ssss   | 22 | 
| 11116 | sss |  | ssss   | 22 | 
| 11117 | sss |  | ssss   | 22 | 
| 11118 | sss |  | ssss   | 22 | 
| 11119 | sss |  | ssss   | 22 | 
| 11120 | sss |  | ssss   | 22 | 
| 11121 | sss |  | ssss   | 22 | 
| 12345 | Sefler |  | [email protected] | 12 | 
+-------+--------+--------+----------------+------+ 
12 rows in set (0.00 sec) 

Ningún registro con id = 11121 en la tabla de profesores pero la tabla de usuarios sí.

Respuesta

5

MySQL no arrojará un error cuando el int se desborde. En su lugar, simplemente lo truncará al mayor valor posible. En el caso de una minúscula sin firmar que es 255. Pero no se lanzará ningún error real.

Cuestiones relacionadas