procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.OraSession1.Open;
Form2.OraSession1.Open;
Form1.OraSession1.StartTransaction;
Form2.OraSession1.StartTransaction;
SessionByName('OraSession1').Commit;
if Form1.OraSession1.InTransaction then
begin
ShowMessage('Form1.OraSession1');
end;
if Form2.OraSession1.InTransaction then
begin
ShowMessage('Form2.OraSession1');
end;
Form1.OraSession1.Commit;
Form1.OraSession1.Commit;
Form2.OraSession1.Commit;
end;
두개의 폼에 각각 OraSession1이라는 이름의 컴포넌트를 올려두고 동일한 데이타베이스에 접속하도록 했습니다.
SessionByName('OraSession1')을 이용하여 찾아진 OraSession에 Commit나 Rollback를 실행하면 어느폼에 있는 OraSession1이 처리되는지 확인해 보았더니 대중이 없어 보입니다.
줄곧 BDE를 사용하다보니 Session.FindDatabase를 이용해도 어플에서 동일한 이름으로 두개의 데이타베이스를 허용하지 않아서 믿을만 하였으나 ODAC는 이런 제약이 없는것 처럼 보입니다.
ODAC를 이용하여 프로그램을 작성하면 OraSession에 트랜젝션 처리를 위해 어떻게 사용하는지 궁금합니다.
전역에 OraSession을 올려놓고 시작할때 초기화 시켜서 호출하여 사용한다던가 디비 작업을 할때마다 커넥션을 생성하여 작업을 실행하고 커넥션을 파괴 한다던가...
경험자 분들의 조언을 기대해 봅니다. ^^
연결이 끊었을 경우나 트랜잭션이 있는지 확인하려고 할때 오라클에 쿼리 하는 방법 밖에 없습니다.
오라클 서버에 현재 세션에 트랜잭션이 있는지 쿼리 하면 리턴해 옵니다.
SELECT a.sid, a.username, b.xidusn, b.used_urec, b.used_ublk
FROM v$session a, v$transaction b
WHERE a.saddr = b.ses_addr;
여기에서 SID 를 초기 로그인할때 알아 오면 되겠죠..
target=_blank>http://www.sqlgate.com