0Pricing
Go Academy · درس

المعاملات

نفّذ الإيداع والتراجع

المعاملات درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

لماذا نستخدم المعاملات؟

تجمع المعاملة عدة عبارات بحيث تنجح كلها أو تفشل كلها معًا. يحافظ ذلك على اتساق البيانات، مثلًا عند نقل الأموال بين حسابين دون فقدانها في منتصف العملية.

  • ذرّية: الكل أو لا شيء
  • حالة متسقة
  • معزولة عن المعاملات الأخرى

db.Begin

يبدأ Begin معاملة ويعيد *sql.Tx. تنفّذ العبارات على Tx، لا على مجمّع الاتصالات، حتى تتشارك اتصالًا واحدًا ومعاملة واحدة.

tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}

العبارات على Tx

استدعِ tx.Exec وtx.Query كما تستدعيهما على db، لكن كل شيء يُنفّذ داخل المعاملة إلى أن تجري عملية التصديق أو التراجع.

_, err = tx.Exec("UPDATE accounts SET balance = balance - $1 WHERE id = $2", 100, 1)

Commit

تجعل tx.Commit() كل تغيير دائمًا ومرئيًا للآخرين. إذا أعادت خطأً، فهذا يعني أن المعاملة لم تُطبّق.

if err := tx.Commit(); err != nil {
    log.Fatal(err)
}

Rollback

إذا فشلت أي خطوة، فاستدعِ tx.Rollback() للتخلص من جميع التغييرات منذ Begin. تعود قاعدة البيانات إلى حالتها السابقة كما لو لم يحدث شيء.

if err != nil {
    tx.Rollback()
    return err
}

نمط defer Rollback

يؤجل الأسلوب الاصطلاحي المتين عملية Rollback مباشرة بعد Begin. ويُعدّ Rollback بعد نجاح Commit عمليةً لا تأثير لها، لذلك يضمن تنظيف الموارد في أي مسار للخطأ.

tx, err := db.Begin()
if err != nil { return err }
defer tx.Rollback()
// ... do work ...
return tx.Commit()

مثال على نقل ذري

يشكّل تحديثان عملية منطقية واحدة: خصم مبلغ من حساب وإضافته إلى حساب آخر. يجب تنفيذ التغييرين معًا أو ألا يُطبّق أي منهما.

محاكاة قابلة للتشغيل لمعاملة

تحتاج المعاملات الحقيقية إلى قاعدة بيانات. يحاكي هذا المثال القابل للتشغيل البدء وتحديثين وعملية التصديق أو التراجع باستخدام خريطة في الذاكرة.

package main

import (
    "errors"
    "fmt"
)

func transfer(bal map[string]int, from, to string, amt int) error {
    if bal[from] < amt {
        return errors.New("insufficient funds")
    }
    snapshot := map[string]int{from: bal[from], to: bal[to]}
    bal[from] -= amt
    bal[to] += amt
    if bal[from] < 0 {
        bal[from], bal[to] = snapshot[from], snapshot[to]
        return errors.New("rolled back")
    }
    return nil
}

func main() {
    bal := map[string]int{"alice": 100, "bob": 20}
    if err := transfer(bal, "alice", "bob", 30); err != nil {
        fmt.Println("error:", err)
    } else {
        fmt.Println("committed:", bal)
    }
}

مستويات العزل

يقبل db.BeginTx خيارات تتضمن مستوى العزل، مثل sql.LevelSerializable. يمنع العزل الأعلى مزيدًا من الحالات الشاذة، لكنه قد يقلل التزامن.

tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})

أبقِ المعاملات قصيرة

تحتفظ المعاملة باتصال، وقد تحتفظ بأقفال أيضًا. نفّذ جميع أوامر SQL بسرعة، وتجنب استدعاءات الشبكة أو إدخال المستخدم داخلها، ثم صدّقها سريعًا لتقليل التنافس.

لا تخلط أبدًا بين db وtx

داخل المعاملة، نفّذ العبارات على tx فقط. يؤدي استدعاء db.Exec هناك إلى استخدام اتصال مختلف خارج المعاملة، ولذلك لا تكون هذه التغييرات جزءًا منها ولن تتراجع مع بقية التغييرات.

تحقق سريع

اختبر معرفتك بالمعاملات.

مراجعة

لقد تعلمت المعاملات:

  • يعيد Begin قيمة *sql.Tx؛ نفّذ العبارات عليها
  • يثبّت Commit التغييرات؛ ويتخلص Rollback من جميع التغييرات
  • يضمن defer tx.Rollback() تنظيف الموارد عند حدوث خطأ
  • يضبط BeginTx مستوى العزل؛ فأبقِ المعاملات قصيرة
  • لا تخلط أبدًا بين db وtx داخل المعاملة الواحدة

الأسئلة الشائعة

هل درس «المعاملات» مجاني؟

نعم — نص درس «المعاملات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «المعاملات»؟

نفّذ الإيداع والتراجع تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «المعاملات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. فتح اتصال
  2. الاستعلام عن الصفوف
  3. العبارات المجهّزة
  4. المعاملات
← العودة إلى Go Academy