اجرای معاملات

ساخت وبلاگ

می توانید معاملات پایگاه داده را با استفاده از SQL. TX انجام دهید ، که نشان دهنده یک معامله است. SQL. TX علاوه بر روشهای تعهد و بازگشت به نمایندگی از معانی خاص معامله ، تمام روش هایی را که شما برای انجام عملیات مشترک پایگاه داده استفاده می کنید ، دارد. برای دریافت SQL. TX ، با DB. Begin یا DB. Begintx تماس می گیرید.

معامله پایگاه داده چندین عملیات را به عنوان بخشی از یک هدف بزرگتر گروه بندی می کند. تمام عملیات باید موفق شود یا هیچ کس نمی تواند ، با یکپارچگی داده ها در هر دو مورد حفظ شود. به طور معمول ، یک گردش کار معامله شامل موارد زیر است:

  1. شروع معامله
  2. انجام مجموعه ای از عملیات پایگاه داده.
  3. در صورت بروز خطایی ، انجام معامله برای ایجاد تغییر پایگاه داده.
  4. در صورت بروز خطایی ، معامله را به عقب برگردانید تا پایگاه داده را بدون تغییر بگذارد.

بسته SQL روش هایی را برای شروع و نتیجه گیری معامله و همچنین روش هایی برای انجام عملیات پایگاه داده مداخله ارائه می دهد. این روشها با چهار مرحله در گردش کار بالا مطابقت دارد.

  • معامله را شروع کنید. db. begin یا db. begintx معامله جدید پایگاه داده را شروع می کند و یک SQL. TX را باز می گرداند که آن را نشان می دهد.
  • عملیات پایگاه داده را انجام دهید. با استفاده از SQL. TX ، می توانید پایگاه داده را در یک سری از عملیات که از یک اتصال واحد استفاده می کنند ، پرس و جو کنید یا به روز کنید. برای پشتیبانی از این ، TX روشهای زیر را صادر می کند:
    • برای ایجاد تغییرات پایگاه داده از طریق بیانیه های SQL مانند درج ، به روزرسانی و حذف ، Exec و ExecContext را اجرا و ExecContext کنید. برای اطلاعات بیشتر ، به اجرای اظهارات SQL که داده ها را برنمی گردند ، ببینید.
    • Query ، QueryContext ، QueryRow و QueryRowContext برای عملیاتی که ردیف ها را برمی گردانند. برای اطلاعات بیشتر ، به پرس و جو برای داده ها مراجعه کنید.
    • آماده ، آماده سازی ، STMT و STMTContext را برای بیانیه های آماده شده آماده کنید. برای اطلاعات بیشتر ، به استفاده از عبارات آماده مراجعه کنید.
    • معامله را با استفاده از tx. commit انجام دهید. اگر تعهد موفق شود (یک خطای صفر را برمی گرداند) ، پس تمام نتایج پرس و جو به عنوان معتبر تأیید می شوند و تمام به روزرسانی های اجرا شده به عنوان یک تغییر اتمی در پایگاه داده اعمال می شوند. در صورت عدم موفقیت تعهد ، تمام نتایج حاصل از پرس و جو و اجرای در TX باید به عنوان نامعتبر دور ریخته شود.
    • معامله را با استفاده از tx. rollback برگردانید. حتی اگر Tx. Rollback نتواند ، معامله دیگر معتبر نخواهد بود و به پایگاه داده نیز متعهد نخواهد شد.

    بهترین روشها

    بهترین روشهای زیر را دنبال کنید تا بهتر از معناشناسی پیچیده و مدیریت اتصال که معاملات گاهی به آن نیاز دارند ، حرکت کنید.

    • برای مدیریت معاملات از API های شرح داده شده در این بخش استفاده کنید. از بیانیه های مربوط به SQL مربوط به معامله مانند شروع و تعهد مستقیم استفاده نکنید ، بنابراین می توانید پایگاه داده خود را در حالت غیرقابل پیش بینی ، به ویژه در برنامه های همزمان قرار دهید.
    • هنگام استفاده از معامله ، مواظب باشید که به طور مستقیم با روشهای غیرقانونی SQL. DB تماس نگیرید ، زیرا این موارد در خارج از معامله انجام می شود ، به کد شما یک دیدگاه متناقض از وضعیت بانک اطلاعاتی یا حتی ایجاد بن بست می دهد.

    مثال

    کد در مثال زیر از معامله برای ایجاد سفارش مشتری جدید برای یک آلبوم استفاده می کند. در طول راه ، کد:

    1. معامله را شروع کنید.
    2. بازپرداخت معامله را به تعویق بیندازید. اگر معامله موفق شود ، قبل از خروج از عملکرد ، مرتکب می شود ، و این باعث می شود که بازپرداخت معوق به عنوان No-Op تماس بگیرد. در صورت عدم موفقیت معامله ، مرتکب نمی شود ، به این معنی که بازپرداخت با استفاده از عملکرد نامیده می شود.
    3. تأیید کنید که موجودی کافی برای آلبومی که مشتری سفارش می دهد وجود دارد.
    4. اگر به اندازه کافی وجود دارد ، تعداد موجودی را به روز کنید و آن را با تعداد آلبوم های سفارش داده شده کاهش دهید.
    5. یک سفارش جدید ایجاد کنید و شناسه تولید شده سفارش جدید را برای مشتری بازیابی کنید.
    6. معامله را انجام دهید و شناسه را برگردانید.

    این مثال از روشهای TX استفاده می کند که یک استدلال متن را به خود اختصاص می دهد. این امر باعث می شود که اجرای عملکرد - از جمله عملیات پایگاه داده - در صورت طولانی شدن یا اتصال مشتری ، لغو شود. برای اطلاعات بیشتر ، به لغو عملیات در حال پیشرفت مراجعه کنید.

    // Creatorder سفارش یک آلبوم را ایجاد می کند و شناسه سفارش جدید را برمی گرداند. Func Creatorder (CTX Context. Context ، AlbumID ، مقدار ، int custid) (OrderID INT64 ، ERR ERROR)// دریافت TX برای درخواست معاملات. tx ، err: = db. begintx (ctx ، nil) اگر اشتباه کنید! = صفر// Defer a rollback in case anything fails. defer tx.Rollback() // Confirm that album inventory is enough for the order. var enough bool if err = tx.QueryRowContext(ctx, "SELECT (quantity>=؟) از آلبوم که در آن مقدار ، آلبومید) . scan (و کافی) ؛خطا! = صفرretu fail(err)>اگر! کافی است// موجودی آلبوم را به روز کنید تا مقدار موجود در سفارش حذف شود. _ ، err = tx. execcontext (ctx ، "به روزرسانی آلبوم مجموعه مجموعه مقدار = مقدار -؟ در کجا کمیت ، آلبومید) اگر اشتباه کنید! = صفر// ایجاد یک ردیف جدید در جدول Album_order. نتیجه ، err: = tx. execcontext (CTX ، "درج آلبوم_رد (آلبوم_id ، cust_id ، کمیت ، تاریخ) مقادیر (؟ ،؟ ،؟ ،؟)" ، آلبومید ، متقاضی ، مقدار ، زمان ()) اگر اشتباه است! = صفر// شناسه مورد سفارش را تازه ایجاد کنید. OrderId ، err = نتیجه. lastinsertid () اگر اشتباه! = صفر// انجام معامله. اگر err = tx. commit () ؛خطا! = صفر// Retu the order ID. retu orderID, nil> 
سیگنالهای معاملاتی...
ما را در سایت سیگنالهای معاملاتی دنبال می کنید

برچسب : نویسنده : عارف لرستانی بازدید : <-PostHit-> تاريخ : دوشنبه 16 مرداد 1402 ساعت: 15:34