| Version 5 (modified by , 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 ги извршува следните чекори како една атомична целина:
- Впишува основен запис во табелата
transaction. - Впишува релациони записи во
transaction_breakdown. - Го ажурира балансот на соодветната сметка во
transaction_account. - Селектира постојни или внесува нови тагови во
tag. - Гради поврзување во табелата
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 и извршувањето се прекинува, што значи дека ниту еден делумен податок не останува трајно зачуван во базата.
