| | 196 | ===== Procedure Reschedule |
| | 197 | Ова е административна операција: летот добива друг авион (може и reschedule, ама најкритичен е капацитетот). |
| | 198 | * Бројот на bookings и капацитетот мора да се проверат во истиот „момент”. |
| | 199 | * Ако паралелно доаѓаат нови reservations, сакаме да го блокираме конфликтот. |
| | 200 | |
| | 201 | {{{ |
| | 202 | DELIMITER $$ |
| | 203 | |
| | 204 | CREATE PROCEDURE sp_change_flight_airplane( |
| | 205 | IN p_flight_id INT, |
| | 206 | IN p_new_airplane_id INT |
| | 207 | ) |
| | 208 | BEGIN |
| | 209 | DECLARE v_booked INT; |
| | 210 | DECLARE v_new_capacity INT; |
| | 211 | |
| | 212 | DECLARE exit handler FOR SQLEXCEPTION |
| | 213 | BEGIN |
| | 214 | ROLLBACK; |
| | 215 | SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Reschedule failed (transaction rolled back).'; |
| | 216 | END; |
| | 217 | |
| | 218 | START TRANSACTION; |
| | 219 | |
| | 220 | SELECT flight_id |
| | 221 | FROM flight |
| | 222 | WHERE flight_id = p_flight_id |
| | 223 | FOR UPDATE; |
| | 224 | |
| | 225 | SELECT COUNT(*) INTO v_booked |
| | 226 | FROM booking |
| | 227 | WHERE flight_id = p_flight_id |
| | 228 | FOR UPDATE; |
| | 229 | |
| | 230 | SELECT capacity INTO v_new_capacity |
| | 231 | FROM airplane |
| | 232 | WHERE airplane_id = p_new_airplane_id |
| | 233 | FOR UPDATE; |
| | 234 | |
| | 235 | IF v_booked > v_new_capacity THEN |
| | 236 | ROLLBACK; |
| | 237 | SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot change aircraft: existing bookings exceed new capacity.'; |
| | 238 | END IF; |
| | 239 | |
| | 240 | UPDATE flight |
| | 241 | SET airplane_id = p_new_airplane_id |
| | 242 | WHERE flight_id = p_flight_id; |
| | 243 | |
| | 244 | COMMIT; |
| | 245 | END$$ |
| | 246 | |
| | 247 | DELIMITER ; |
| | 248 | }}} |