همانطور که می دانید، در زمان اجرای پروسیجر FINISH_REDEF_TABLE، باید برای مدت زمان کوتاهی جدول به صورت exclusive قفل شود تا اجرای پروسیجر با موفقیت خاتمه یابد در غیر این صورت، اجرای این پروسیجر تا اتمام تراکنشهایی دیگری که بر روی جدول در حال اجرا هستند، متوقف و در حالت انتطار باقی خواهد ماند:
SQL> EXEC DBMS_REDEFINITION.can_redef_table(‘USEF’, ‘MYTBL’);
PL/SQL procedure successfully completed
SQL> EXEC DBMS_REDEFINITION.start_redef_table(‘USEF’, ‘MYTBL’, ‘MYTBL_TEMP’);
PL/SQL procedure successfully completed
SQL> EXEC DBMS_REDEFINITION.sync_interim_table(‘USEF’, ‘MYTBL’, ‘MYTBL_TEMP’);
PL/SQL procedure successfully completed
–session 1:
SQL> delete MYTBL where rownum<=1;
1 row deleted
–Session 2
SQL> EXEC DBMS_REDEFINITION.finish_redef_table(‘USEF’, ‘MYTBL’, ‘MYTBL_TEMP’);
Waiting…
همانطور که در قسمت فوق قابل مشاهده است، دستور finish_redef_table در حالت انتطار قرار گرفته است تا session شماره یک به کارش خاتمه دهد.
از اوراکل 12c می توان به این انتظار، محدودیت زمانی ای را اعمال کرد، این کار با کمک پارامتر dml_lock_timeout از پروسیجر finish_redef_table قابل انجام خواهد بود.
SQL> EXEC DBMS_REDEFINITION.finish_redef_table(‘USEF’, ‘MYTBL’, ‘MYTBL_TEMP’,dml_lock_timeout => 10);
ORA-42012: error occurred while completing the redefinition
ORA-42042: time out in acquiring DML lock during online redefinition
Elapsed: 00:00:11.11
Comment (1)