| | 84 | {{{ |
| | 85 | DELIMITER $$ |
| | 86 | |
| | 87 | CREATE PROCEDURE sp_reserve_seat( |
| | 88 | IN p_flight_id INT, |
| | 89 | IN p_seat CHAR(4), |
| | 90 | IN p_passenger_id INT, |
| | 91 | IN p_price DECIMAL(10,2) |
| | 92 | ) |
| | 93 | BEGIN |
| | 94 | DECLARE v_capacity INT; |
| | 95 | DECLARE v_booked INT; |
| | 96 | DECLARE exit handler FOR SQLEXCEPTION |
| | 97 | BEGIN |
| | 98 | ROLLBACK; |
| | 99 | SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Reservation failed (transaction rolled back).'; |
| | 100 | END; |
| | 101 | |
| | 102 | START TRANSACTION; |
| | 103 | |
| | 104 | SELECT a.capacity INTO v_capacity |
| | 105 | FROM flight f |
| | 106 | JOIN airplane a ON a.airplane_id = f.airplane_id |
| | 107 | WHERE f.flight_id = p_flight_id |
| | 108 | FOR UPDATE; |
| | 109 | |
| | 110 | SELECT COUNT(*) INTO v_booked |
| | 111 | FROM booking |
| | 112 | WHERE flight_id = p_flight_id |
| | 113 | FOR UPDATE; |
| | 114 | |
| | 115 | IF v_booked >= v_capacity THEN |
| | 116 | ROLLBACK; |
| | 117 | SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Flight is full (capacity exceeded).'; |
| | 118 | END IF; |
| | 119 | |
| | 120 | INSERT INTO booking (flight_id, seat, passenger_id, price) |
| | 121 | VALUES (p_flight_id, p_seat, p_passenger_id, p_price); |
| | 122 | |
| | 123 | COMMIT; |
| | 124 | END$$ |
| | 125 | |
| | 126 | DELIMITER ; |
| | 127 | }}} |
| | 128 | |
| | 129 | |