برنامه نویسی

معاملات بدون جلسه در پایگاه داده 23AI (23.6)

در پایگاه داده اوراکل ، معاملات به طور سنتی به جلسات بستگی دارد. وقتی یک جلسه بسته شد ، معامله مرتبط خاتمه می یابد. با این حال ، با شروع Oracle 23AI (23.6) ، ویژگی معاملات بدون جلسه اجازه می دهد تا معاملات در جلسات مختلف به حالت تعلیق درآیند و از سر گرفته شود. این ویژگی به طور موثری وابستگی بین معاملات و جلسات را از بین می برد.

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

برای استفاده از این ویژگی ، آشنایی با عملکرد dbms_transaction.start_transaction ضروری است. این تابع پارامترهای زیر را دارد:

DBMS_TRANSACTION.START_TRANSACTION(
   xid              in raw default null,
   transaction_type in pls_integer default TRANSACTION_TYPE_LOCAL,
   timeout          in pls_integer default 60,
   flag             in pls_integer default 0
) RETURN VARCHAR2;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

· XID: نام معامله.

· Transaction_Type: نوع معامله ، مانند Transaction_Type_Local ، Transaction_Type_Sessionless یا Transaction_Type_xa.

· Timeout: مدت زمان (در ثانیه) را مشخص می کند که معامله پس از تعلیق از سر گرفته می شود.

· پرچم: پرچم می تواند برای شروع یک معامله جدید یا معامله_resume برای از سرگیری یک معامله معلق باشد.

تظاهرات

مرحله 1: یک جدول ایجاد کنید

ابتدا یک جدول برای اهداف تظاهرات ایجاد کنید:

SQL> create table tbl_sessionless (id number,First_name varchar2(20),last_name varchar2(30));
Table created.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 2: معامله بدون جلسه را شروع کنید
در یک جلسه جدید ، یک معامله بدون جلسه را شروع کرده و یک ردیف را در جدول قرار دهید. سپس معامله (Arsenal01) را به حالت تعلیق درآورید و جلسه را ببندید:

جلسه 1:

SQL> select sid from v$mystat where rownum=1;
       SID
----------
       138

SQL> set serveroutput on
SQL> declare
  TRANID VARCHAR2(128);
begin
  TRANID := DBMS_TRANSACTION.START_TRANSACTION
  ( XID              => UTL_RAW.CAST_TO_RAW('Arsenal01')
  , transaction_type => DBMS_TRANSACTION.TRANSACTION_TYPE_SESSIONLESS
  , timeout          => 5
  , flag             => DBMS_TRANSACTION.TRANSACTION_NEW
  );
 dbms_output.put_line('TRANID is: ' || TRANID);
end;
/
TRANID is: 417273656E616C3031
PL/SQL procedure successfully completed.

SQL> insert into tbl_sessionless values(1,'Vahid','Yousefzadeh');
1 row created.

SQL> select * from tbl_sessionless;
        ID FIRST_NAME           LAST_NAME
---------- -------------------- ------------------------------
         1 Vahid                Yousefzadeh

SQL> execute DBMS_TRANSACTION.SUSPEND_TRANSACTION;
PL/SQL procedure successfully completed.

SQL> exit
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 3: معامله را در یک جلسه دیگر از سر بگیرید
جلسه دیگری را شروع کنید و معامله را از سر بگیرید (Arsenal01):

جلسه 2:

SQL> select sid from v$mystat where rownum=1;
       SID
----------
       507

SQL> select * from tbl_sessionless;
no rows selected

SQL> set serveroutput on
SQL> declare
    TRANID VARCHAR2(128);
begin
    TRANID := DBMS_TRANSACTION.START_TRANSACTION
    ( xid              => UTL_RAW.CAST_TO_RAW('Arsenal01')
    , transaction_type => DBMS_TRANSACTION.TRANSACTION_TYPE_SESSIONLESS
    , flag             => DBMS_TRANSACTION.TRANSACTION_RESUME
    );
dbms_output.put_line('Resumed TRANID: '||TRANID);
end;
/
Resumed TRANID: 417273656E616C3031
PL/SQL procedure successfully completed.

SQL> select * from tbl_sessionless;
        ID FIRST_NAME           LAST_NAME
---------- -------------------- ------------------------------
         1 Vahid                Yousefzadeh
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پرس و جو اکنون ردیف درج شده را برمی گرداند. معامله (Arsenal01) در جلسه جدید فعال است ، همانطور که توسط Querying v $ معامله نشان داده شده است:

SQL> select s.sid,s.TADDR,s.PROGRAM from v$transaction t,v$session s where t.ADDR=s.TADDR;
       SID TADDR            PROGRAM
---------- ---------------- ------------------------------
       507 00000000CB5651E8 sqlplus@OEL9 (TNS V1-V3)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله 4: معامله را انجام دهید
سرانجام ، معامله (Arsenal01) را برای خاتمه دادن به آن انجام دهید:

SQL> commit;
Commit complete.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

SQL> select * from tbl_sessionless;
        ID FIRST_NAME           LAST_NAME
---------- -------------------- ------------------------------
         1 Vahid                Yousefzadeh
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پس از ارتکاب ، تلاش برای از سرگیری معامله منجر به خطایی خواهد شد:

SQL> set serveroutput on
SQL> declare
    TRANID VARCHAR2(128);
begin
    TRANID := DBMS_TRANSACTION.START_TRANSACTION
    ( xid              => UTL_RAW.CAST_TO_RAW('Arsenal01')
    , transaction_type => DBMS_TRANSACTION.TRANSACTION_TYPE_SESSIONLESS
    , flag             => DBMS_TRANSACTION.TRANSACTION_RESUME
    );
dbms_output.put_line('Resumed TRANID: '||TRANID);
end;
/
ORA-26218: sessionless transaction with GTRID 417273656E616C3031 does not
exist.
ORA-06512: at "SYS.DBMS_TRANSACTION", line 299
ORA-06512: at line 4
Help: https://docs.oracle.com/error-help/db/ora-26218/
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

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

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

دکمه بازگشت به بالا