Changes between Version 4 and Version 5 of AdvancedApplicationDevelopment


Ignore:
Timestamp:
06/14/26 20:26:37 (2 days ago)
Author:
211101
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedApplicationDevelopment

    v4 v5  
    22
    33За да се разликуваат трансакциите во системот како ентитети и трансакциите како теоретски поим во областа на датабазите, првите ќе ги нарекувам "финансиски трансакции", а вторите "трансакции во датабаза" во понатамошните спомнувања
    4 === Трансакции во датабаза
    5 - [wiki:Transaction1 Атомично креирање на финансиска трансакција со една помошна финансиска трансакција]
    6 - [wiki:Transaction2 Атомично креирање на финансиска трансакција со повеќе помошни финансиски трансакции]
    7 - [wiki:Transaction3 Ажурирање на финансиска трансакција со поништување на претходните ефекти]
    84
    95=== Pooling на конекции
     6Го користам пакетот `postgres.js` (инстанциран во [source:/app/lib/db.ts]), кој автоматски воспоставува pooling. Без потреба од дополнителни конфигурации, овој систем одржува активни конекции(стандардно 10 паралелни конекции) што драстично ја намалува латенцијата помеѓу серверските акции во Next.js и операциите на базата на податоци.
     7
     8Овој систем е заштитен од дуплирање на конекции при hot-reload во развојна околина, со зачувување на инстанцата во `global` објектот.
     9
     10=== Трансакции во датабаза
     11Користам `sql.begin()` блокови за секоја операција што бара прво проверка или повеќекратен упис, елиминирајќи го ризикот од race conditions.
     12
     13'''Пример 1: Внесување на финансиска трансакција'''
     14
     15Сместена во [source:/app/(app)/add/actions.ts#L205:292], акцијата `addTransaction` ги извршува следните чекори како една атомична целина:
     16 1. Впишува основен запис во табелата `transaction`.
     17 2. Впишува релациони записи во `transaction_breakdown`.
     18 3. Го ажурира балансот на соодветната сметка во `transaction_account`.
     19 4. Селектира постојни или внесува нови тагови во `tag`.
     20 5. Гради поврзување во табелата `tag_assigned_to_transaction`.
     21
     22'''Пример 2: Валидација и манипулација врз основа на проверка'''
     23
     24За да се осигураме дека нема да се зачуваат дупликати поради истовремени кликови или барања(race conditions), се користи истата `sql.begin()` логика при креирање и промена на профили:
     25- '''Регистрација на профил:''' Во [source:/app/(auth)/actions.ts#L68:79] проверката дали внесениот `email` веќе постои се извршува во иста трансакција со креирањето на новиот профил. Доколку друга регистрација се обиде со истиот мејл во тој момент, трансакцијата се блокира.
     26- '''Ажурирање на профил:''' При промена на email во [source:/app/(app)/profile/actions.ts#L35:51], сите проверки за преклопување и самата `UPDATE` команда се спроведуват атомично.
     27- '''Додавање тагови:''' Во [source:app/(app)/add/actions.ts#L80:90], акцијата за додавање нов таг користи трансакција за првично да изврши `SELECT` и да провери дали постои таг со тоа име, пред да направи `INSERT`.
     28
     29'''Заштитен механизам:''' Ако било кој од чекорите во блоковите врати грешка(на пример: тагот веќе постои, балансот е невалиден или податоците се некомплетни), целиот `sql.begin` блок прави '''rollback''' и извршувањето се прекинува, што значи дека ниту еден делумен податок не останува трајно зачуван во базата.