المعاملات والترحيلات
أنماط BEGIN/COMMIT وترحيلات المخطط
المعاملات والترحيلات درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
المعاملات في database/sql
غلّفوا العمليات داخل معاملة باستخدام db.BeginTx. نفّذوا Commit أو rollback في النهاية؛ وأجّلوا دائمًا عملية rollback للتعامل مع حالات panic.
tx, err := db.BeginTx(ctx, nil)
if err != nil { return err }
defer tx.Rollback() // no-op after Commit
_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance-100 WHERE id=$1", from)
if err != nil { return err }
_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance+100 WHERE id=$1", to)
if err != nil { return err }
return tx.Commit()مستويات عزل المعاملات
مرّروا sql.TxOptions للتحكم في مستوى العزل:
tx, err := db.BeginTx(ctx, &sql.TxOptions{
Isolation: sql.LevelSerializable,
ReadOnly: false,
})استخدام Tx نفسها عبر الدوال
مرّروا *sql.Tx إلى الدوال المساعدة حتى تشارك جميعها في المعاملة نفسها. لا تستدعوا db.ExecContext داخل معاملة — استخدموا tx.ExecContext.
نمط تأجيل التراجع
أجّل استدعاء Rollback مباشرة بعد BeginTx. إذا نجح Commit، فلن يكون للتراجع اللاحق أي تأثير. وإذا فشل Commit، فسيؤدي التراجع إلى إلغاء التغييرات.
tx, _ := db.BeginTx(ctx, nil)
defer tx.Rollback() // safe no-op after successful Commitنقاط الحفظ
استخدم نقاط الحفظ داخل المعاملة لتنفيذ عمليات تراجع جزئية (خاصة بـ PostgreSQL عبر SQL خام):
tx.ExecContext(ctx, "SAVEPOINT sp1")
// ... work ...
tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT sp1") // partial rollbackنظرة عامة على ترحيلات قاعدة البيانات
الترحيلات عبارة عن نصوص SQL ذات إصدارات تُطوّر المخطط تدريجيًا. ولكل ترحيل اتجاه up (للتطبيق) واتجاه down (للتراجع).
golang-migrate
تشغّل github.com/golang-migrate/migrate/v4 ملفات ترحيل SQL ذات الإصدارات بالترتيب، وتتتبّع الإصدار المطبّق في جدول schema_migrations.
m, _ := migrate.New("file://migrations", dsn)
m.Up() // apply all pending migrationsgoose
تُعد github.com/pressly/goose/v3 مكتبة ترحيل شائعة أخرى، وتدعم ترحيلات SQL وترحيلات دوال Go باستخدام أمري up وdown.
goose.Up(db, "migrations")Atlas لإدارة المخطط
توفر Atlas إدارة تصريحية للمخطط: تحدد حالة المخطط المطلوبة، ثم تحسب Atlas الفروقات وتنشئ نصوص الترحيل تلقائيًا.
تشغيل الترحيلات عند بدء التشغيل
شغّل الترحيلات برمجيًا في main قبل بدء الخادم، لضمان أن يكون المخطط محدّثًا عند النشر.
if err := runMigrations(db); err != nil { log.Fatal(err) }أفضل ممارسات الترحيلات
يجب أن يتناول كل ترحيل موضوعًا واحدًا وأن يكون متوافقًا مع الإصدارات المستقبلية (إضافيًا). لا تحذف الأعمدة مباشرةً — علّمها بأنها مهملة، ثم احذفها في ترحيل لاحق بعد توقف الشيفرة عن الإشارة إليها.
تحقق سريع
لماذا ينبغي لك دائمًا تأجيل tx.Rollback() مباشرة بعد BeginTx؟
خلاصة: المعاملات والترحيلات
النقاط الأساسية:
- BeginTx → defer Rollback → العمل → Commit
- مرّر *sql.Tx إلى الدوال المساعدة؛ واستخدم tx.ExecContext بدلًا من db.ExecContext
- استخدم golang-migrate أو goose لترحيلات SQL ذات الإصدارات
- شغّل الترحيلات عند بدء التشغيل؛ واجعل كل ترحيل إضافيًا
الأسئلة الشائعة
هل درس «المعاملات والترحيلات» مجاني؟
نعم — نص درس «المعاملات والترحيلات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «المعاملات والترحيلات»؟
أنماط BEGIN/COMMIT وترحيلات المخطط تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «المعاملات والترحيلات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- database/sql وبرامج التشغيل
- sqlx: فحص البُنى والاستعلامات المسمّاة
- pgx: برنامج تشغيل PostgreSQL عالي الأداء
- المعاملات والترحيلات