Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

tôi có thể duy trì một phiên Oracle từ hai máy khách oci không?

Nếu bạn đang sử dụng cơ sở dữ liệu 11g, bạn có thể sử dụng DBMS_XA gói để cho phép một phiên tham gia giao dịch bắt đầu bởi phiên đầu tiên. Khi Tim Hall từ bỏ nhiệm vụ, bạn có thể bắt đầu giao dịch trong một phiên, tham gia giao dịch đó từ phiên khác và đọc các thay đổi chưa cam kết được thực hiện trong giao dịch. Tuy nhiên, thật không may, điều đó sẽ không hữu ích với các biến phiên (giả sử rằng "biến phiên" có nghĩa là biến gói có phạm vi phiên).

Tạo gói và bảng:

CREATE TABLE foo( col1 NUMBER );

create or replace package pkg_foo
as
  g_var number;
  procedure set_var( p_in number );
end;

create or replace package body pkg_foo
as
  procedure set_var( p_in number )
  as
  begin
    g_var := p_in;
  end;
end;

Trong Phiên 1, chúng tôi bắt đầu một giao dịch toàn cục, đặt biến gói và chèn một hàng vào bảng trước khi tạm dừng giao dịch toàn cầu (cho phép một phiên khác tiếp tục lại)

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_xid dbms_xa_xid := dbms_xa_xid( 1 );
  3    l_ret integer;
  4  begin
  5    l_ret := dbms_xa.xa_start( l_xid, dbms_xa.tmnoflags );
  6    pkg_foo.set_var(42);
  7    dbms_output.put_line( 'Set pkg_foo.g_var to ' || pkg_foo.g_var );
  8    insert into foo values( 42 );
  9    l_ret := dbms_xa.xa_end( l_xid, dbms_xa.tmsuspend );
 10* end;
SQL> /
Set pkg_foo.g_var to 42

PL/SQL procedure successfully completed.

Trong phiên 2, chúng tôi tiếp tục giao dịch toàn cầu, đọc từ bảng, đọc biến phiên và kết thúc giao dịch toàn cầu. Lưu ý rằng truy vấn đối với bảng sẽ thấy hàng mà chúng tôi đã chèn nhưng thay đổi biến gói không hiển thị.

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_xid dbms_xa_xid := dbms_xa_xid( 1 );
  3    l_ret integer;
  4    l_col1 integer;
  5  begin
  6    l_ret := dbms_xa.xa_start( l_xid, dbms_xa.tmresume );
  7    dbms_output.put_line( 'Read pkg_foo.g_var as ' || pkg_foo.g_var );
  8    select col1 into l_col1 from foo;
  9    dbms_output.put_line( 'Read COL1 from FOO as ' || l_col1 );
 10    l_ret := dbms_xa.xa_end( l_xid, dbms_xa.tmsuccess );
 11* end;
SQL> /
Read pkg_foo.g_var as
Read COL1 from FOO as 42

PL/SQL procedure successfully completed.

Để chia sẻ trạng thái phiên giữa các phiên, có thể sử dụng ngữ cảnh ứng dụng toàn cầu thay vì sử dụng các biến gói? Bạn có thể kết hợp nó với DBMS_XA nếu bạn muốn đọc cả bảng cơ sở dữ liệu và trạng thái phiên.

Tạo bối cảnh và gói với getter và setter

CREATE CONTEXT my_context
  USING pkg_foo
  ACCESSED GLOBALLY;

create or replace package pkg_foo
as
  procedure set_var( p_session_id in number,
                     p_in         in number );
  function get_var( p_session_id in number )
    return number;
end;

create or replace package body pkg_foo
as
  procedure set_var( p_session_id in number,
                     p_in         in number )
  as
  begin
    dbms_session.set_identifier( p_session_id );
    dbms_session.set_context( 'MY_CONTEXT', 'G_VAR', p_in, null, p_session_id );
  end;
  function get_var( p_session_id in number )
    return number
  is
  begin
    dbms_session.set_identifier( p_session_id );
    return sys_context('MY_CONTEXT', 'G_VAR');
  end;
end;

Trong phiên 1, hãy đặt giá trị của biến ngữ cảnh G_VAR đến 47 cho phiên 12345

begin
  pkg_foo.set_var( 12345, 47 );
end;

Bây giờ, phiên 2 có thể đọc giá trị từ ngữ cảnh

  1* select pkg_foo.get_var( 12345 ) from dual
SQL> /

PKG_FOO.GET_VAR(12345)
----------------------
                    47



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSRS 2016 Nguồn dữ liệu sẽ không hiển thị loại kết nối Oracle

  2. So sánh ngày của Oracle trong mệnh đề where

  3. TẢI THÔNG TIN DỮ LIỆU tương đương trong Oracle

  4. `show create table` tương đương trong oracle sql

  5. Sự cố NHibernate TransactionScope với Oracle 11g