Changes between Version 5 and Version 6 of Transakcii


Ignore:
Timestamp:
04/28/26 01:09:33 (5 days ago)
Author:
213192
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Transakcii

    v5 v6  
    221221
    222222MVCC vs Locking: Главната разлика помеѓу MVCC и класичното заклучување е во тоа што MVCC дозволува читање без блокирање, додека locking пристапот блокира операции. MVCC обезбедува подобра конкурентност, но бара дополнителна меморија за чување на повеќе верзии.
     223
     224== Примери
     225
     2261. 2 клуба што истовремено се обидуваат да купат ист играч
     227
     228Услови: играчот може да оди само во 1 клуб, клубот мора да има буџет, вредноста на играчот се зема „најнова пред трансфер“, се бројат статистики пред трансфер, системот мора да избегне lost update, write skew, deadlock.
     229
     230Без добра контрола двата клуба го купуваат истиот играч.
     231{{{
     232SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
     233
     234BEGIN;
     235
     236-- 1. LOCK PLAYER
     237SELECT current_club_id
     238FROM players
     239WHERE player_id = 65
     240FOR UPDATE;
     241
     242-- 2. LOCK BUYING CLUB
     243SELECT budget
     244FROM clubs
     245WHERE club_id = 10
     246FOR UPDATE;
     247
     248-- 3. CHECK: дали веќе е трансфериран?
     249-- ако current_club_id = 10 → ROLLBACK
     250
     251-- 4. CHECK: доволен буџет
     252-- ако budget < 5000000 → ROLLBACK
     253
     254-- 5. MVCC READ (не блокира)
     255-- најнова вредност пред трансфер
     256SELECT market_value_in_eur
     257FROM player_valuations
     258WHERE player_id = 65
     259  AND date <= CURRENT_DATE
     260ORDER BY date DESC
     261LIMIT 1;
     262
     263-- 6. COUNT активности (MVCC snapshot)
     264SELECT COUNT(*)
     265FROM appearances
     266WHERE player_id = 65
     267  AND date < CURRENT_DATE;
     268
     269SELECT COUNT(*)
     270FROM game_events
     271WHERE player_id = 65
     272  AND date < CURRENT_DATE;
     273
     274-- 7. UPDATE буџет
     275UPDATE clubs
     276SET budget = budget - 5000000
     277WHERE club_id = 10;
     278
     279-- 8. TRANSFER
     280UPDATE players
     281SET current_club_id = 10
     282WHERE player_id = 65;
     283
     284-- 9. LOG transfer
     285INSERT INTO transfers(player_id, from_club, to_club, transfer_fee, transfer_date)
     286VALUES (65, 5, 10, 5000000, CURRENT_DATE);
     287
     288COMMIT;
     289}}}
     290
     291MVCC не блокираат туку читаат snapshots од податоци. Row-level locking го заклучува само дадениот ред, а seriaziable спречува write skew. Овој пример демонстрира реален конкурентен систем каде повеќе трансакции се обидуваат да модифицираат исти ресурси.
     292
     2932. Трансфер со специфични барања
     294
     295Клуб сака да купи играч но не смее да има повеќе од 25 играчи, не смее да има повеќе од 5 играчи со > 20 goals, се зема form (последни настапи) пред трансфер, повеќе трансакции можат истовремено да купуваат играчи.
     296
     297Проблемот тука е што ако имаме 2 трансакции, и двете мислат дека има место и ако не контролираме и двете ќе додадат играч и ќе се наруши условот.
     298
     299{{{
     300SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
     301
     302BEGIN;
     303
     304-- 1. LOCK PLAYER
     305SELECT current_club_id
     306FROM players
     307WHERE player_id = 80
     308FOR UPDATE;
     309
     310-- 2. LOCK CLUB
     311SELECT club_id
     312FROM clubs
     313WHERE club_id = 10
     314FOR UPDATE;
     315
     316-- 3. CHECK TOTAL SQUAD SIZE (MVCC snapshot)
     317SELECT COUNT(*)
     318FROM players
     319WHERE current_club_id = 10;
     320
     321-- ако >= 25 → ROLLBACK
     322
     323-- 4. CHECK HIGH-SCORING PLAYERS
     324SELECT COUNT(*)
     325FROM appearances
     326WHERE player_current_club_id = 10
     327  AND goals > 20;
     328
     329-- ако >= 5 → ROLLBACK
     330
     331-- 5. GET PLAYER FORM (MVCC read)
     332SELECT AVG(goals)
     333FROM appearances
     334WHERE player_id = 80
     335  AND date > CURRENT_DATE - INTERVAL '6 months';
     336
     337-- 6. OPTIONAL BUSINESS RULE
     338-- ако form < 2 → можеби не купуваме
     339
     340-- 7. UPDATE PLAYER
     341UPDATE players
     342SET current_club_id = 10
     343WHERE player_id = 80;
     344
     345-- 8. INSERT TRANSFER
     346INSERT INTO transfers(player_id, from_club, to_club, transfer_fee, transfer_date)
     347VALUES (80, 3, 10, 8000000, CURRENT_DATE);
     348
     349COMMIT;
     350}}}
     351
     352Овој пример демонстрира write skew проблем кој не може да се реши со класично заклучување, бидејќи агрегатните проверки не заклучуваат конкретни редови. Затоа се користи SERIALIZABLE изолација која гарантира дека паралелните трансакции нема да доведат до неконзистентна состојба. MVCC овозможува аналитичките операции да се извршуваат без блокирање, додека row-level locking спречува директни конфликти врз исти записи.