Читаоци попут вас помажу у подршци МУО. Када обавите куповину користећи везе на нашем сајту, можда ћемо зарадити провизију за партнере.

Прављење веб апликације спремне за производњу захтева од вас да осигурате да је безбедна и скалабилна.

Једна од најважнијих ствари које треба знати о базама података је АЦИД принцип који означава атомичност, конзистентност, изолацију и трајност. Релационе базе података као што је МиСКЛ изворно подржавају АЦИД трансакције. Али МонгоДБ је НоСКЛ база података и подразумевано не подржава АЦИД трансакције.

Као програмер, требало би да знате како да уведете својства АЦИД у своје МонгоДБ базе података.

Шта су трансакције базе података?

Трансакција базе података је низ упита или операција базе података које се све заједно извршавају као једна јединица да би се извршио један задатак.

Трансакције базе података се придржавају концепта АЦИД карактеристика. Ово помаже да се осигура да нема промена осим ако све операције нису успешне. Такође осигурава да је база података конзистентна.

instagram viewer

Објашњена својства АЦИД

Четири својства која чине принципе АЦИД су:

  • Атомицити је својство које концептуализује трансакције као мале јединице програма. Ово имплицира да се сви упити или покрећу успешно или не успевају заједно.
  • Доследност наводи да записи базе података морају остати доследни пре и после сваке трансакције.
  • Изолација осигурава да, када се више трансакција одвија истовремено, једна не утиче на другу.
  • Трајност фокусира се на системске кварове или грешке. Осигурава да се извршена трансакција не изгуби у случају квара система. Ово може укључивати технике неопходне за аутоматско враћање података из резервне копије када се систем поново покрене.

Како имплементирати МонгоДБ трансакције базе података у Ноде.јс користећи Монгоосе

МонгоДБ је постао широко коришћена технологија базе података током година због његова НоСКЛ природа и флексибилан модел заснован на документима. Такође вам нуди могућност да боље организујете своје податке и флексибилније него у СКЛ-у или релационим базама података.

Да бисте имплементирали трансакције базе података у МонгоДБ, можете размотрити пример сценарија у апликацији за листу послова где корисник може да објави, ажурира или избрише посао. Ево једноставног дизајна шеме базе података за ову апликацију:

За наставак, овај одељак захтева основно знање о програмирању Ноде.јс и МонгоДБ.

Трансакције нису подржане на самосталним МонгоДБ инсталацијама. Мораћете да користите а МонгоДБ скуп реплика или МонгоДБ раздијељени кластер да би трансакције функционисале. Стога је најлакши начин коришћења трансакција да креирајте МонгоДБ инстанцу у облаку (МонгоДБ Атлас). Подразумевано, свака инстанца Атлас базе података је скуп реплика или подељени кластер.

Након што сте поставили радни Ноде.јс и МонгоДБ пројекат, можете подесити везу са Монго базом података у Ноде.јс. Ако до сада нисте, инсталирајте монгоосе покретањем нпм инсталл монгоосе у вашем терминалу.

увоз Мунгос из 'Мунгос'

нека МОНГО_УРЛ = процесс.енв. МОНГО_УРЛ || 'иоур-монго-датабасе-урл';

дозволити веза;
конст цоннецтДб = асинц () => {
покушати {
чекати монгоосе.цоннецт (МОНГО_УРЛ, {
усеНевУрлПарсер: истина,
усеУнифиедТопологи: истина,
});

цонсоле.лог("ПОВЕЗАНО НА БАЗУ ПОДАТАКА");
веза = мунгос.веза;
} улов (ерр) {
цонсоле.еррор("ПОВЕЗИВАЊЕ БАЗЕ ПОДАТАКА НЕУСПЕШНО!");
конзола.еррор(ерр.мессаге);
процес.излаз(1); // затворите апликацију ако веза са базом података не успе
}
};

Требало би да сачувате везу у променљивој тако да можете да је користите за покретање трансакције касније у програму.

Колекције корисника и послова можете имплементирати на следећи начин:

конст усерСцхема = Нова Мунгос. Шема({
име: Низ,
емаил: Низ,
послови: [Мунгос. Шема. Врсте. ОбјецтИд]
});

конст јобСцхема = Нова Мунгос. Шема({
наслов: Низ,
локација: Низ,
плата: Низ,
плакат: Мунгос.Шема.Врсте.ОбјецтИд
});

цонст усерЦоллецтион = монгоосе.модел('корисник', усерСцхема);
цонст јобЦоллецтион = монгоосе.модел('посао', јобСцхема);

Можете написати функцију за додавање корисника у базу података овако:


конст цреатеУсер = асинц (корисник) => {
конст невУсер = чекати усерЦоллецтион.цреате (корисник);
конзола.лог("Корисник је додат у базу података");
конзола.лог (невУсер);
}

Код испод показује функцију за креирање посла и додавање на листу послова његовог постера помоћу трансакције базе података.


конст цреатеЈоб = асинц (посао) => {
конст { усерЕмаил, наслов, локација, плата } = посао;

// добијамо корисника из базе података
конст корисник = чекати усерЦоллецтион.финдОне({ емаил: усерЕмаил });

// започне сесију трансакције
конст сесија = чекати цоннецтион.стартСессион();

// покреће све упите базе података у блоку три-цатцх
покушати {
чекати сессион.стартТрансацтион();

// креирати посао
конст невЈоб = чекати јобЦоллецтион.цреате(
[
{
наслов,
локација,
плата,
постер: усер._ид,
},
],
{ седница }
);
конзола.лог("Креирано Нова посао успешно!");
конзола.лог (невЈоб[0]);

// додај посао на корисничку листу објављених послова
конст невЈобИд = невЈоб[0]._ид;
конст аддедТоУсер = чекати усерЦоллецтион.финдБиИдАндУпдате(
ИД корисник,
{ $аддТоСет: { послови: невЈобИд } },
{ седница }
);

конзола.лог("Посао је успешно додат на листу послова корисника");
конзола.лог (аддедТоУсер);

чекати сессион.цоммитТрансацтион();

конзола.лог("Успешно обављена ДБ трансакција");
} улов (е) {
конзола.еррор (е);
конзола.лог("Неуспешно довршавање операција базе података");
чекати сессион.абортТрансацтион();
} коначно {
чекати сессион.ендСессион();
конзола.лог("Завршена сесија трансакције");
}
};

А Креирај упит који се покреће у трансакцији обично преузима и враћа низ. Ово можете видети у коду изнад где се креира Нови посао и складишти своје _ид имовине уневЈобИд променљива.

Ево демонстрације како горе наведене функције функционишу:

конст моцкУсер = {
име: "Тими Омолана",
емаил: "јобпостер@екампле.цом",
};

конст моцкЈоб = {
титула: "Менаџер продаје",
локација: "Лагос, Нигерија",
плата: „$40,000",
усерЕмаил: "јобпостер@екампле.цом", // емаил креираног корисника
};

конст стартСервер = асинц () => {
чекати цоннецтДб();
чекати цреатеУсер (моцкУсер);
чекати цреатеЈоб (моцкЈоб);
};

стартСервер()
.онда()
.цатцх((ерр) => конзола.лог (ерр));

Ако сачувате овај код и покренете га користећи нпм старт или чвор команду, требало би да произведе излаз овако:

Други начин имплементације АЦИД трансакција у МонгоДБ користећи Монгоосе је коришћење витхТрансацтион() функција. Овај приступ пружа мало флексибилности јер покреће све упите унутар функције повратног позива које проследите као аргумент функцији.

Можете рефакторисати горњу трансакцију базе података да бисте је користили витхТрансацтион() овако:

конст цреатеЈоб = асинц (посао) => {
конст { усерЕмаил, наслов, локација, плата } = посао;

// добијамо корисника из базе података
конст корисник = чекати усерЦоллецтион.финдОне({ емаил: усерЕмаил });

// започне сесију трансакције
конст сесија = чекати цоннецтион.стартСессион();

// покреће све упите базе података у блоку три-цатцх
покушати {
конст трансакцијаСуццесс = чекати сессион.витхТрансацтион(асинц () => {
конст невЈоб = чекати јобЦоллецтион.цреате(
[
{
наслов,
локација,
плата,
постер: усер._ид,
},
],
{ седница }
);

конзола.лог("Креирано Нова посао успешно!");
конзола.лог (невЈоб[0]);

// додај посао на корисничку листу објављених послова
конст невЈобИд = невЈоб[0]._ид;
конст аддедТоУсер = чекати усерЦоллецтион.финдБиИдАндУпдате(
ИД корисник,
{ $аддТоСет: { послови: невЈобИд } },
{ седница }
);

конзола.лог("Посао је успешно додат на листу послова корисника");
конзола.лог (аддедТоУсер);
});

ако (трансацтионСуццесс) {
конзола.лог("Успешно обављена ДБ трансакција");
} друго {
конзола.лог("Трансакција није успела");
}
} улов (е) {
конзола.еррор (е);
конзола.лог("Неуспешно довршавање операција базе података");
} коначно {
чекати сессион.ендСессион();
конзола.лог("Завршена сесија трансакције");
}
};

Ово би произвело исти резултат као претходна имплементација. Слободни сте да изаберете који стил ћете користити када имплементирате трансакције базе података у МонгоДБ.

Ова имплементација не користи цоммитТрансацтион() и абортТрансацтион() функције. Ово је зато што витхТрансацтион() функција аутоматски урезује успешне трансакције и прекида оне неуспеле. Једина функција коју треба да позовете у свим случајевима је сессион.ендСессион() функција.

Имплементација трансакција базе података АЦИД у МонгоДБ

Трансакције базе података су једноставне за коришћење када се раде исправно. Сада би требало да разумете како трансакције базе података функционишу у МонгоДБ-у и како их можете применити у Ноде.јс апликацијама.

Да бисте даље истражили идеју АЦИД трансакција и како оне функционишу у МонгоДБ-у, размислите о изградњи финтецх новчаника или апликације за блоговање.