I created test table as shown below:
CREATE TABLE test (
num int
);
Then, I inserted the row whose num is 2 as shown below:
INSERT INTO test (num) VALUES (2);
Then, I created my_func() function which updates num to 5, then causes error by SIGNAL statement as shown below:
DELIMITER $$
CREATE FUNCTION my_func() RETURNS INT
DETERMINISTIC
BEGIN
UPDATE test SET num = 5;
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An error occurred';
RETURN NULL;
END$$
DELIMITER ;
Then, calling my_func() gets the error, then num was rollbacked to 2 as shown below:
mysql> SELECT my_func();
ERROR 1644 (45000): An error occurred
...
mysql> SELECT num FROM test;
+------+
| num |
+------+
| 2 |
+------+
Actually, I created my_proc() procedure which updates num to 5, then causes error by SIGNAL statement as shown below:
DELIMITER $$
CREATE PROCEDURE my_proc()
BEGIN
UPDATE test SET num = 5;
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An error occurred';
END$$
DELIMITER ;
Then, calling my_proc() gets the error but num is not rollbacked to 2 as shown below:
mysql> CALL my_proc();
ERROR 1644 (45000): An error occurred
...
mysql> SELECT num FROM test;
+------+
| num |
+------+
| 5 |
+------+
So, is a function atomic in MySQL?