wiki:AdvancedApplicationDevelopment

Version 5 (modified by 211101, 2 days ago) ( diff )

--

Напреден апликативен развој (Трансакции, Pooling)

За да се разликуваат трансакциите во системот како ентитети и трансакциите како теоретски поим во областа на датабазите, првите ќе ги нарекувам "финансиски трансакции", а вторите "трансакции во датабаза" во понатамошните спомнувања

Pooling на конекции

Го користам пакетот postgres.js (инстанциран во app/lib/db.ts), кој автоматски воспоставува pooling. Без потреба од дополнителни конфигурации, овој систем одржува активни конекции(стандардно 10 паралелни конекции) што драстично ја намалува латенцијата помеѓу серверските акции во Next.js и операциите на базата на податоци.

Овој систем е заштитен од дуплирање на конекции при hot-reload во развојна околина, со зачувување на инстанцата во global објектот.

Трансакции во датабаза

Користам sql.begin() блокови за секоја операција што бара прво проверка или повеќекратен упис, елиминирајќи го ризикот од race conditions.

Пример 1: Внесување на финансиска трансакција

Сместена во app/(app)/add/actions.ts#L205:292, акцијата addTransaction ги извршува следните чекори како една атомична целина:

  1. Впишува основен запис во табелата transaction.
  2. Впишува релациони записи во transaction_breakdown.
  3. Го ажурира балансот на соодветната сметка во transaction_account.
  4. Селектира постојни или внесува нови тагови во tag.
  5. Гради поврзување во табелата tag_assigned_to_transaction.

Пример 2: Валидација и манипулација врз основа на проверка

За да се осигураме дека нема да се зачуваат дупликати поради истовремени кликови или барања(race conditions), се користи истата sql.begin() логика при креирање и промена на профили:

  • Регистрација на профил: Во app/(auth)/actions.ts#L68:79 проверката дали внесениот email веќе постои се извршува во иста трансакција со креирањето на новиот профил. Доколку друга регистрација се обиде со истиот мејл во тој момент, трансакцијата се блокира.
  • Ажурирање на профил: При промена на email во app/(app)/profile/actions.ts#L35:51, сите проверки за преклопување и самата UPDATE команда се спроведуват атомично.
  • Додавање тагови: Во app/(app)/add/actions.ts#L80:90, акцијата за додавање нов таг користи трансакција за првично да изврши SELECT и да провери дали постои таг со тоа име, пред да направи INSERT.

Заштитен механизам: Ако било кој од чекорите во блоковите врати грешка(на пример: тагот веќе постои, балансот е невалиден или податоците се некомплетни), целиот sql.begin блок прави rollback и извршувањето се прекинува, што значи дека ниту еден делумен податок не останува трајно зачуван во базата.

Note: See TracWiki for help on using the wiki.