Changes between Version 24 and Version 25 of Трансакции


Ignore:
Timestamp:
06/15/25 17:39:47 (15 hours ago)
Author:
183175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Трансакции

    v24 v25  
    4141-> Можност за враќање на промените ако настане грешка \\
    4242
     43== Update
     44= Atomicity
     45Како што веќе кажавме, за еден успешен Atomicity потребно е имплементација на неколку клучни точки. \\
     46Користам '''{{{BEGIN }}}'''на почеток, потоа '''{{{COMMIT}}}'''ако помине успешно, и '''{{{ROLLBACK}}}'''ако има грешка.\\
     47Ако некој чекор не успее, во '''{{{catch}}}'''фаќаме грешки, повикуваме '''{{{ROLLBACK}}}''', \\
     48и трансакцијата се поништува а притоа ниту еднапромена не се зачувува.\\
     49Сега по поставам реални примери од фајлот '''app.js''' каде ги имам употребено истите за да докажеме Atomicity :\\
     50\\
     51'''Пример 1 : /order API'''\\
     52Првин трансакцијата почнува со
     53{{{#!sql
     54await client.query("BEGIN");
     55}}}\\
     56Потоа ги правам сите операции (провери, внеси, ажурирај залиха ...)\\
     57Ако некаде има грешка, се отфрла целата операција, и за крај :\\
     58{{{#!sql
     59await client.query("ROLLBACK");
     60}}}\\
     61Доколку сите операции и обиди поминат успешно, се извршува :\\
     62{{{#!sql
     63await client.query("COMMIT");
     64}}}\\
     65\\
     66'''Пример 2 : Залиха'''\\
     67Сега ке видиме еден пример како што гласи правилото, трансакција мора да се врати назад ако еден дел од неа не успее.\\
     68Ако залихата за некој производ и големина фали,односно нема залиха, фрли грешка:
     69{{{#!sql
     70if (currentStock < item.quantity) {
     71  throw new Error(`Недоволна залиха за продукт ${item.product_name} (${item.size})`);
     72}
     73}}}\\
     74Ова е пример каде во '''catch ''' ке дојде некоја грешка и ке направи '''ROLLBACK'''\\
     75{{{#!sql
     76await client.query("ROLLBACK");
     77}}}\\
     78\\
     79'''Пример 3 :  /order endpoint'''\\
     80Овде имам употреба на '''{{{BEGIN }}}''','''{{{COMMIT}}}''' и '''{{{ROLLBACK}}}'''.\\
     81{{{#!sql
     82const client = await db.pool.connect();
     83try {
     84  await client.query("BEGIN");
     85  // ... сите останати потребни чекори ...
     86  await client.query("COMMIT");
     87} catch (err) {
     88  await client.query("ROLLBACK");
     89} finally {
     90  client.release();
     91}
     92
     93}}}\\
     94\\
     95'''Пример 4 : Try/catch'''\\
     96Секој чекор во процесот се наоѓа во блок '''try''', па да видиме пример за ажурирање на залиха :\\
     97{{{#!sql
     98await client.query(
     99  "UPDATE stock SET quantity = quantity - $1, updated_at = NOW() WHERE id_stock = $2",
     100  [deductQty, stockRow.id_stock]
     101);
     102}}}\\
     103Кога овој момент нема да успее, ке премине во блок '''catch'''.\\