اوراکل 23ai-قابلیت Automatic Transaction Rollback(تنظیم اولویت برای تراکنشها)

در صورتی که دو کاربر قصد ویرایش یک رکورد را داشته باشند، کاربری که دیرتر دستور update را اجرا کرده Block خواهد شد و تا زمانی که کاربر اول(کاربری که زودتر رکورد را در اختیار گرفته) به تراکنش خاتمه ندهد، کاربر دوم در حالت Block باقی خواهد ماند.

--session 1:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
      2190
SQL> update USEF.TBL1 set  id=1;
1 row updated
--session 2:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
       944

SQL> update USEF.TBL1 set id=1;
Executing…

بلاک شدن session دوم را می توانیم از طریق دستور زیر ببینیم:

SQL>  select SID,ID1,ID2,LMODE,block,request from v$lock where type='TX';
       SID        ID1        ID2      LMODE      BLOCK    REQUEST
---------- ---------- ---------- ---------- ---------- ----------
       944     458766       2511          0          0          6
      2190     458766       2511          6          1          0

ممکن است کاربر دوم که تراکنشش در حالت انتظار قرار دارد، برای ما اولویت بیشتری داشته باشد. در این حالت چه راهکاری وجود دارد؟

اوراکل در نسخه 23c با ارائه چند پارامتر این مسئله را قابل کنترل کرده است و این امکان را فراهم کرده تا اگر تراکنشهای با اولویت پایین، سد راه تراکنشهای با اولویت بالا شوند، به صورت خودکار و با گذراندن زمان مشخصی، تراکنشهای با اولویت کمتر rollback شوند.

پارامترهای مربوط به قابلیت Automatic transaction rollback را در قسمت زیر مشاهده می کنید:

txn_priority                                   string      HIGH
txn_auto_rollback_mode                         string      ROLLBACK
txn_auto_rollback_high_priority_wait_target    integer     2147483647
txn_auto_rollback_medium_priority_wait_target  integer     2147483647

پارامتر txn_priority یکی از پارامترهای مهم و اثر گذار در این زمینه است و از طریق آن می توانیم برای تراکنشها در سطح session اولویت تنظیم کنیم اولویت یک تراکنش می تواند HIGH، MEDIUM و یا LOW باشد که به صورت پیش فرض اولویت همه تراکنشها به HIGH تنظیم شده و عملا به صورت خودکار تراکنشی Rollback نخواهند شد.

SQL> alter session set txn_priority ={HIGH,MEDIUM,LOW};

پارامتر txn_auto_rollback_high_priority_wait_target هم دیگر پارامتر اثرگذار در این زمینه است این پارامتر مشخص می کند تراکنش با اولویت HIGH، حداکثر چند ثانیه باید منتظر تراکنشی با اولویت LOW و یا MEDIUM بماند بعد از مدت زمان تعیین شده، تراکنش با اولویت کمتر Rollback شده و session مربوط به آن kill خواهد شد.

در سناریوی زیر بیشتر با نقش این دو پارامتر آشنا خواهیم شد:

در ابتدا پارامتر txn_auto_rollback_high_priority_wait_target را به 5 ثانیه تنظیم می کنیم:

SQL> alter system set txn_auto_rollback_high_priority_wait_target=40;
System altered.

در session شماره یک تراکنشی را با اولویت پایین اجرا می کنیم:

--session 1:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
      1391

SQL> alter session set txn_priority=LOW;
Session altered.

SQL> update USEF.TBL1 set id=1391 where id=1;
1 row updated.
--session 2:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
      1408

SQL> alter session set txn_priority=LOW;
Session altered.

SQL> update USEF.TBL1 set id=1408 where id=1;
Executing…

با اجرای این دستور، session 1408 توسط session 1391 بلاک خواهد شد:

SQL> select sid, event, seconds_in_wait, blocking_session  from v$session where event like ‘%enq%’;  

در session شماره سه، تراکنشی با اولویت HIGH اجرا خواهد شد:

--session 3:
SQL> select sid from v$mystat where rownum=1;
       SID
----------
      2910

SQL> alter session set txn_priority=HIGH;
Session altered.

SQL> update USEF.TBL1 set id=2910 where id=1;
Executing…

Session شماره سه هم توسط session 1391 بلاک شده است اما با توجه به آنکه session شماره سه از اولویت بیشتری برخوردار است، حداکثر ظرف مدت 40 ثانیه از حالت block خارج می شود و رکورد مورد نظر را در اختیار خواهد گرفت:

SQL> select sid, event, seconds_in_wait, blocking_session  from v$session where event like ‘%enq%’;  

برای قابلیت Automatic transaction rollback دو ستون txn_priority و txn_priority_wait_target به ویوی v$transcation اضافه شده است و از طریق این ویو هم می توانیم بر روی این قابلیت نظارت داشته باشیم:

SQL> select ADDR,txn_priority, txn_priority_wait_target from v$transaction;
ADDR                TXN_PRI TXN_PRIORITY_WAIT_TARGET
----------------    ------- ------------------------
0000000085CA11A0   HIGH                          40

بعد از گذشت چهل ثانیه، session شماره سه، رکورد را در اختیار خواهد گرفت و دو session دیگر kill خواهند شد:

--session 3:
SQL> update USEF.TBL1 set id=2910 where id=1;
1 row updated.
--session 1:
SQL> select sid from v$mystat where rownum=1;
ORA-03113: end-of-file on communication channel
Process ID: 76244
Session ID: 1391 Serial number: 61119
--session 2:
SQL> select sid from v$mystat where rownum=1;
ORA-03113: end-of-file on communication channel
Process ID: 76246
Session ID: 1408 Serial number: 35823

بعد از اتفاقات فوق، پیام زیر در alert log نمایش داده می شود:

TEHRANPDB(3):Session (sid: 1391, serial: 61119, xid: 1.0.17832, txn_priority: "LOW") terminated by transaction (sid: 2910, serial: 43419, xid: -1.-1.-1, txn_priority: "HIGH") because of the parameter "txn_auto_rollback_high_priority_wait_target = 40"
2023-08-23T12:23:48.287763+04:30 TEHRANPDB(3):Session (sid: 1408, serial: 35823, xid: 9.27.23564, txn_priority: "LOW") terminated by transaction (sid: 2910, serial: 43419, xid: -1.-1.-1, txn_priority: "HIGH") because of the parameter "txn_auto_rollback_high_priority_wait_target = 40"

 

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *