Changes between Version 40 and Version 41 of Transactions


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

--

Legend:

Unmodified
Added
Removed
Modified
  • Transactions

    v40 v41  
    7979* се осигуруваме дека операцијата е атомична (COMMIT или ROLLBACK),
    8080
     81==== Procedure Reserve Seat (спречува overbooking + double seat)
     82Затоа што имаме “check-then-write” логика: прво проверуваме капацитет/број резервации, па insert. Без транзакција, две сесии можат да поминат проверки паралелно и да го надминат капацитетот.
    8183
     84{{{
     85DELIMITER $$
     86
     87CREATE 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)
     93BEGIN
     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;
     124END$$
     125
     126DELIMITER ;
     127}}}
     128
     129