Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีทำ ROLLBACK ธุรกรรมภายใน MySQL Stored Procedure


ตามที่ทราบว่า ROLLBACK จะย้อนกลับการเปลี่ยนแปลงใดๆ ที่ทำไปที่ฐานข้อมูลหลังจากเริ่มธุรกรรมแล้ว เพื่อทำ ROLLBACK ใน MySQL Stored Procedure เราต้องประกาศ EXIT Handler เราสามารถใช้ Handler สำหรับ sqlexception หรือ SQL warnings ได้ สามารถเข้าใจได้จากตัวอย่างที่มี Stored Procedure ที่มี ROLLBACK สร้างสำหรับตารางที่มีรายละเอียดดังนี้:

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)

เราเห็นว่าคอลัมน์ name ไม่สามารถมีค่า NULL ได้ และตารางมีข้อมูลดังนี้:

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)

ตัวอย่าง

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)

เราเห็นจากชุดผลลัพธ์ข้างต้นว่าการเปลี่ยนแปลงที่ทำโดยคำสั่ง UPDATE ถูก ROLLBACK กลับ เพราะคำสั่งแรกของ INSERT โยนข้อผิดพลาด (พยายามแทรกค่า NULL)