Middleware를 이용한 Transaction Samples
1] Oracle managed transactions(Local Transaction)
1. CLIENT:
tx_call (“debit_credit”);
2. Application Server:
debit_credit(request_block)
TPSVCINFO *request_block;
{ /* unpack request_block -> data into amt, from_acct,to_acct */
EXEC SQL UPDATE; /* credit */
EXEC SQL UPDATE; /* debit */
EXEC SQL COMMIT;
tx_return();
}
tx_begin() 이나 tx_commit()/tx_rollback() 이 없다는 이야기는 TPM이 생성하는 GTID 에 의해 transaction 이 시작/종료 되지 않음을 의미 EXEC SQL statement에 의해서 transaction이 시작되고 EXEC COMMIT에 의해서 transaction 이 종료가 된다.
2] TPM managed Transactions
1. CLIENT:
tx_begin();
tx_call (“debit”);
tx_call (“credit”);
tx_commit();
2. Application Server 1 :
debit (request_block)
TPSVCINFO *request_block;
{ /* unpack request_block -> data into amt, from_acct,to_acct */
EXEC SQL UPDATE; /* debit */
tx_return();
}
3. Application Server 2 :
credit(request_block)
TPSVCINFO *request_block;
{ /* unpack request_block -> data into amt, from_acct,to_acct */
EXEC SQL UPDATE; /* credit */
tx_return();
}
하나의 Transaction에 2개의 Service 를 call 할 수 있고 이기종 DB의 call 도 가능 하다.Client에 의하여 Transaction 이 시작(tx_begin())되었고, 종료(tx_commit()) 된다.
3] OPS 와의 Integration
V7 에서는 특정 Platform(NCR) 에서는 XA library 를 OPS와 함께 사용 못함. 그 이유는 Platform에 implementation ehls 이ㅡdl Process-based locking뿐만 아니라 transaction-based locking을 지원해야만 가능 하기 때문.
V8 에서는 DLM은 Oracle이 제공..... 따라서
1. OPS option 을 사용 가능 하다면 Oracle XA library 기동 가능
2. OPS 의 어느 node로 부터 fail된 transaction들도 복구 가능
3. 어떤 instance(node) 로 부터의 in-doubt transaction 도 스스로 발견 commit
4. XA 의 recover call 은 모든 instance들의 모든 prepared transaction list를 제공 한다.
4] Global + Local transaction 의 지원
Local Transaction 은 Oracle server 에 의해서 완벽하게 조정되는 Transaction.
Global Transaction은 TPM 과 같은 외부 Transaction manager에 의해 관장 되는 Transaction
V8 에서는 Global + Local Transaction 의 지원 이 이루어짐.
Xa_open(oracle_xa+acc=p/scott/tiger + .......); TM 이 oracle connection
open 후
update emp set sal=sal + 100; ------ Local
commit; ----- Transaction (V7 에서는 ORA-2041 error)
tx_begin();
.......... ------- Global
........... ------- Transaction
tx_commit();
|