Computer >> Máy Tính >  >> Lập trình >> MySQL

Làm thế nào chúng ta có thể thực hiện các giao dịch ROLLBACK bên trong một thủ tục được lưu trữ MySQL?


Như chúng ta biết rằng ROLLBACK sẽ hoàn nguyên bất kỳ thay đổi nào được thực hiện đối với cơ sở dữ liệu sau khi giao dịch đã được bắt đầu. Để thực hiện ROLLBACK trong thủ tục lưu trữ MySQL, chúng ta phải khai báo EXIT người xử lý. Chúng ta có thể sử dụng một trình xử lý cho cảnh báo sqlexception hoặc SQL. Nó có thể được hiểu với sự trợ giúp của một ví dụ trong đó thủ tục được lưu trữ có ROLLBACK được tạo cho bảng có các chi tiết sau -

mysql> SHOW CREATE table gg\G
*************************** 1. row ***************************
       Table: gg
Create Table: CREATE TABLE `gg` (
   `Id` int(11) NOT NULL AUTO_INCREMENT,
   `Name` varchar(30) NOT NULL,
   PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

Chúng ta có thể thấy rằng cột 'name' không thể có giá trị NULL và bảng có dữ liệu sau -

mysql> Select * from employee.tbl;
+----+---------+
| Id | Name    |
+----+---------+
|  1 | Mohan   |
|  2 | Gaurav  |
|  3 | Sohan   |
|  4 | Saurabh |
|  5 | Yash    |
|  6 | Rahul   |
+----+---------+
6 rows in set (0.00 sec)

Ví dụ

mysql> Delimiter //
mysql> Create Procedure st_transaction_Rollback()
    -> BEGIN
    -> DECLARE exit handler for sqlexception
    -> BEGIN
    -> ROLLBACK;
    -> END;
    -> DECLARE exit handler for sqlwarning
    -> BEGIN
    -> ROLLBACK;
    -> END;
    -> START TRANSACTION;
    -> INSERT INTO employee.tbl(name) values();
    -> UPDATE employee.tbl set name = 'YashPal' where id = 5;
    -> COMMIT;
    -> END //
Query OK, 0 rows affected (0.02 sec)

mysql> Delimiter ;
mysql> CALL st_transaction_Rollback ()
Query OK, 0 rows affected (0.00 sec)

mysql> Select * from employee.tbl;
+----+---------+
| Id | Name    |
+----+---------+
|  1 | Mohan   |
|  2 | Gaurav  |
|  3 | Sohan   |
|  4 | Saurabh |
|  5 | Yash    |
|  6 | Rahul   |
+----+---------+
6 rows in set (0.00 sec)

Từ tập kết quả ở trên, chúng ta có thể thấy rằng các thay đổi được thực hiện bởi câu lệnh UPDATE đã bị ROLLBACKED vì truy vấn đầu tiên của INSERT đã gây ra lỗi (cố gắng chèn các giá trị NULL).