Database Transactions

5 minutes to read
2 views

Database Transactions

Database Transaction ဆိုတာ ဘာလဲ?

Database မှာ Operation တစ်ခုတည်း မဟုတ်ဘဲ Operation အများကြီးကို ဆက်တိုက်လုပ်ရတဲ့အချိန်တွေ ရှိပါတယ်။ ဥပမာ Bank Transfer တစ်ခုမှာ Account A က ငွေနုတ်ပြီး Account B ထဲ ငွေထည့်ရပါတယ်။ ဒီ Operation နှစ်ခုက တစ်ခုနဲ့တစ်ခု ဆက်စပ်နေပါတယ်။

ဒါပေမယ့် Account A က ငွေနုတ်ပြီး Account B ထဲ မရောက်သေးခင် Server Crash ဖြစ်သွားရင် Account A မှာတော့ ငွေလျော့သွားပြီး Account B မှာ မရောက်သေးတဲ့ Data Error ဖြစ်သွားနိုင်ပါတယ်။ ဒီလို Partial Update ပြဿနာကို ကာကွယ်ဖို့ Database Transaction ကို အသုံးပြုပါတယ်။

Database Transaction ဆိုတာ Database Operation အများအပြားကို တစ်ခုတည်းသော Unit အဖြစ် Execute လုပ်ပေးတဲ့ Mechanism ဖြစ်ပါတယ်။ Transaction ထဲက Operation အားလုံး အောင်မြင်မှ Database မှာ အတည်ပြုသိမ်းဆည်း (Commit) လုပ်ပြီး၊ တစ်ခုခု Fail ဖြစ်သွားရင် Operation အားလုံးကို Cancel (Rollback) လုပ်ပေးပါတယ်။


Transaction က ဘယ်လိုအလုပ်လုပ်တာလဲ?

Transaction တစ်ခုကို စလိုက်တာနဲ့ Database ဟာ Changes တွေကို ချက်ချင်း မသိမ်းသေးပါဘူး။ Operation အားလုံး အောင်မြင်တဲ့အထိ စောင့်ပြီးမှ Database ထဲကို အတည်ပြုသိမ်းပါတယ်။

ဥပမာ Account A က $100 နုတ်ပြီး Account B ကို $100 ထည့်တဲ့ Transfer တစ်ခုကို စဉ်းစားကြည့်ပါ။

  1. Account A က $100 နုတ်မယ်။
  2. Account B ထဲ $100 ထည့်မယ်။
  3. Operation နှစ်ခုလုံး အောင်မြင်ရင် Commit လုပ်မယ်။
  4. တစ်ခုခု Fail ဖြစ်ရင် Rollback လုပ်ပြီး အရင်အတိုင်း ပြန်ထားမယ်။

ဒီလိုလုပ်ခြင်းအားဖြင့် Operation တစ်ဝက်တစ်ပျက်ကြောင့် ဖြစ်လာနိုင်တဲ့ Data Error တွေကို ကာကွယ်နိုင်ပါတယ်။


ACID ဆိုတာ ဘာလဲ?

Database Transaction တွေ မှန်မှန်ကန်ကန် အလုပ်လုပ်နိုင်ဖို့ ACID Properties ဆိုတဲ့ Rule လေးခုကို လိုက်နာရပါတယ်။

Atomicity

Transaction ထဲက Operation အားလုံးဟာ "All or Nothing" ဖြစ်ရပါမယ်။ Operation အားလုံး အောင်မြင်မှ Commit လုပ်ပြီး၊ တစ်ခုခု Fail ဖြစ်သွားရင်တော့ Operation အားလုံးကို Rollback လုပ်ရပါမယ်။

Consistency

Transaction မစခင်နဲ့ ပြီးဆုံးပြီးတဲ့အချိန်မှာ Database ဟာ Valid State မှာပဲ ရှိရပါမယ်။ Transaction ကြောင့် Database Rules တွေ မပျက်စီးသွားစေရပါဘူး။

Isolation

Transaction အများအပြားကို တစ်ပြိုင်တည်း Execute လုပ်နေရင်တောင် Transaction တစ်ခုရဲ့ လုပ်ဆောင်ချက်ဟာ အခြား Transaction တွေကို မထိခိုက်စေရပါဘူး။

Durability

Transaction ကို Commit လုပ်ပြီးတာနဲ့ Data ဟာ အမြဲတမ်း သိမ်းဆည်းထားရပါမယ်။ Server Restart ဖြစ်သွားတာ၊ Power ပျက်သွားတာမျိုး ဖြစ်ခဲ့ရင်တောင် Commit လုပ်ပြီးသား Data မပျောက်သင့်ပါဘူး။


Commit ဆိုတာ ဘာလဲ?

Commit ဆိုတာ Transaction ထဲက Operation အားလုံး အောင်မြင်သွားတဲ့အခါ Database ကို အတည်ပြုသိမ်းလိုက်တာ ဖြစ်ပါတယ်။

Commit ပြီးသွားတဲ့ Data ကို Rollback နဲ့ ပြန်ဖျက်လို့ မရတော့ပါဘူး။

ဥပမာ

Account A = $900
Account B = $600

Transfer ပြီး Commit လုပ်လိုက်ရင်

Account A = $800
Account B = $700

ဒီ State က Database ထဲမှာ အမြဲတမ်း သိမ်းသွားပါပြီ။


Rollback ဆိုတာ ဘာလဲ?

Rollback ဆိုတာ Transaction အတွင်းမှာ Error တစ်ခုခု ဖြစ်သွားတဲ့အခါ ပြုလုပ်ထားတဲ့ Changes အားလုံးကို Cancel လုပ်ပြီး Database ကို မူလအခြေအနေအတိုင်း ပြန်ထားပေးတာ ဖြစ်ပါတယ်။

ဥပမာ

  • Account A က ငွေနုတ်ပြီးသွားတယ်။
  • Account B Update လုပ်တဲ့အချိန် Database Error ဖြစ်သွားတယ်။

ဒီလိုအချိန်မှာ Rollback လုပ်လိုက်ရင်

Account A = $900
Account B = $600

မူလအတိုင်း ပြန်ဖြစ်သွားပါလိမ့်မယ်။


Node.js Example

MySQL Transaction တစ်ခုကို Node.js နဲ့ ရေးမယ်ဆိုရင် ဒီလိုပုံစံမျိုး ဖြစ်နိုင်ပါတယ်။

const connection = await pool.getConnection();

try {
  await connection.beginTransaction();

  await connection.query(
    "UPDATE accounts SET balance = balance - 100 WHERE id = 1",
  );

  await connection.query(
    "UPDATE accounts SET balance = balance + 100 WHERE id = 2",
  );

  await connection.commit();
} catch (error) {
  await connection.rollback();
} finally {
  connection.release();
}

Transaction စပြီး Account နှစ်ခုလုံး Update အောင်မြင်ရင် commit() လုပ်ပါတယ်။ Error ဖြစ်သွားရင် rollback() လုပ်ပြီး Database ကို အရင် State ပြန်ရောက်အောင် လုပ်ပေးပါတယ်။


Isolation Levels ဆိုတာ ဘာလဲ?

Transaction အများကြီး တစ်ပြိုင်တည်း Run နေတဲ့အခါ Data မမှားအောင် Isolation Level တွေကို Database က သတ်မှတ်ပေးထားပါတယ်။

Read Uncommitted

တခြား Transaction Commit မလုပ်ရသေးတဲ့ Data ကိုတောင် ဖတ်နိုင်ပါတယ်။ Performance မြန်ပေမယ့် Production မှာ အသုံးနည်းပါတယ်။

Read Committed

Commit လုပ်ပြီးသား Data ကိုပဲ ဖတ်နိုင်ပါတယ်။ Database အများစုမှာ အသုံးများတဲ့ Isolation Level တစ်ခု ဖြစ်ပါတယ်။

Repeatable Read

Transaction တစ်ခုအတွင်းမှာ Query ကို အကြိမ်ကြိမ် Run လုပ်ရင် Result တူနေစေပါတယ်။ MySQL (InnoDB) ရဲ့ Default Isolation Level ဖြစ်ပါတယ်။

Serializable

Transaction တွေကို တစ်ခုပြီးမှ တစ်ခု Run သလို Handle လုပ်ပေးတဲ့ Isolation Level ဖြစ်ပါတယ်။ Data Consistency အမြင့်ဆုံးရပေမယ့် Lock ပိုများပြီး Concurrency နဲ့ Performance လျော့နိုင်ပါတယ်။ Banking လို Data Accuracy အရမ်းအရေးကြီးတဲ့ System တွေမှာ အသုံးပြုလေ့ရှိပါတယ်။


Transaction ကို ဘယ်အချိန်မှာ အသုံးပြုသင့်လဲ?

Operation တစ်ခု Fail ဖြစ်ရင် ကျန်တဲ့ Operation တွေပါ မလုပ်သင့်တဲ့ အခြေအနေတိုင်းမှာ Transaction ကို အသုံးပြုသင့်ပါတယ်။

ဥပမာ

  • Bank Transfer
  • Order Creation
  • Payment Processing
  • Wallet Balance Update
  • Inventory Management

ဒီလို Business Logic တွေမှာ Transaction မရှိရင် Data Error ဖြစ်နိုင်ခြေ အရမ်းများပါတယ်။


အကျဉ်းချုပ်အားဖြင့် Database Transaction ဆိုတာ Database Operation အများအပြားကို တစ်ခုတည်းသော Unit အဖြစ် Execute လုပ်ပေးတဲ့ Mechanism ဖြစ်ပါတယ်။ ACID Properties ကြောင့် Data Consistency ကို ထိန်းသိမ်းနိုင်ပြီး Commit နဲ့ Rollback ကို အသုံးပြုကာ Partial Update ပြဿနာတွေကို ကာကွယ်ပေးပါတယ်။ Payment၊ Banking၊ Order နဲ့ Inventory စတဲ့ Business-critical System တွေမှာ Database Transaction ဟာ မရှိမဖြစ် အသုံးပြုသင့်တဲ့ Feature တစ်ခုဖြစ်ပါတယ်။

Related Posts