| | 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''' и извршувањето се прекинува, што значи дека ниту еден делумен податок не останува трајно зачуван во базата. |