Changes between Version 44 and Version 45 of Transactions


Ignore:
Timestamp:
02/10/26 18:15:07 (3 weeks ago)
Author:
222039
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Transactions

    v44 v45  
    194194}}}
    195195
     196===== Procedure Reschedule
     197Ова е административна операција: летот добива друг авион (може и reschedule, ама најкритичен е капацитетот).
     198* Бројот на bookings и капацитетот мора да се проверат во истиот „момент”.
     199* Ако паралелно доаѓаат нови reservations, сакаме да го блокираме конфликтот.
     200
     201{{{
     202DELIMITER $$
     203
     204CREATE PROCEDURE sp_change_flight_airplane(
     205  IN p_flight_id INT,
     206  IN p_new_airplane_id INT
     207)
     208BEGIN
     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;
     245END$$
     246
     247DELIMITER ;
     248}}}