معاملات بدون جلسه در پایگاه داده 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/