تراکنشهای خودمختار به شما اجازه میدهند که محیط یک تراکنش فراخوانی را ترک کنید، تراکنشهای خودمختار انجام دهید، و بدون تاثیرگذاری بر روی شرایط یک تراکنش فراخوانی به آن برگردید. تراکنشهای خودمختار با تراکنشهای فراخوانی پیوندی ندارند، بنابراین تنها دادههای متعهد را میتوان بین هر دو تراکنش به اشتراک گذاشت.
انواع بلوکهای PL/SQL میتوانند به عنوان تراکنشهای خودمختار تعریف شوند:
پروسه ها و توابع ذخیره شده
روش های محلی و توابع تعریف شده در یک بلوک اعلان PL/SQL.
پروسهها و توابع بستهبندی شده.
روشهای تایپ
بلوکهای ناشناس در سطح بالا
سادهترین راه برای درک معاملات خودمختار این است که در عمل آنها را ببینید. برای این کار، ما یک جدول آزمون ایجاد و آن را با دو ردیف پر میکنیم. توجه کنید که دادهها متعهد نیستند.
بعد ما 8 ردیف دیگر هم با استفاده از بلوکهای خودمختار عنوان شده به عنوان تراکنشهای خودمختار قرار میدهیم، که شامل یک عبارت متعهد هم میشود.
همان طور که پیشبینی میشد، حالا ما011 ریدف در جدول داریم.حالا اگر یک جملهی رولبک اعمال کنیم نتیجهیزیر را میگیریم.
دو تا از ریفهایی که توسط جلسهی کنونی ما (تراکنش) عقب کشیده شده اند، در حالیکه ردیفهای قراردادهشده توسط تراکنشهای خودمختار باقی مانده آند. حضور دستوردهندهی کامپایلر PRAGMA AUTONOMOUS_TRANSACTION باعث شده که بلاک خودمختار در تراکنش خودش اجرا شود، و به همین خاطر جمله داخللی متعهد بر روی تراکنش فراخوانی تاثیری نداشته است. در نتیجه رولبک همچنان قادر به تاثیرگذاری بر روی دیامال اعمال شده توسط جملهی کنونی بود
تراکنشهای خودمختار عموما توسط روال لاگکردن خطاها استفاده میشوند. در چنین جاهایی، پیام/ های خطا میبایست بدون توجه به وضعیت تعهد/رولبک تراکنش نگهداری شوند. برای نمونه، جدول زیر شامل پیامهای خطای اساسی میشود.
ما بری لاگ کردن پیام های خطا به عنوان یک تراکنشهای خودمختار، یک فرآیند تعریف میکنیم.
کد زیر بر روی خطا تمرکز میکند، که گرفته شده و لاگ شده است.
با توجه به این کادر میتوانیم ببینیم که تراکنش LOG_ERRORS از تراکنش خودمختار جدا بوده است. اگر چنین نبود، میتوانستیم توقع داشه باشیم که اولین کد قرار داده شده در بلاک خودمختار توسط جمله متعهد در فرآیند theLOG_ERRORS نشان داده شود.
مراقب باشید که به چه شکلی ازتراکنش خودختار استفاده میکنید. اگر از آنها بدون ترتیب و آرایش خاصی استفاده شود میتواند منجر به ددلاک شده و در جلسه رهیابی اختلال ایجاد کنند. برای روشن کردن این نکته به این نقل قول از تام کایت توجه کنید:
«...در بیشتر مواقعی که شما مجبور به استفاده از تراکنش خودمختار هستید، این بدین معناست که احتمالا شما یک مشکل جدی در رابطه با تمامیت داده ها دارید که هنوز دربارهاش فکری نکردهاید.
مردم کجاها از آنها استفاده میکنند؟
-در آن آغازگری که فرآیندی که متعهد میشود رافرا میخواند (نه یک روال لاگکردن خطا). چنین چیزی موقع رولبک کردن دردناک است.
-در آن آغازگری که برای جدول در حال جهش، مانع ایجاد میکند. درد چنین چیزی حتی بیشتر از قبلی است
با لاگکردن خطاها مشکلی نیست؛
اما با بیشتر چیزهای دیگه، هست.