2012-03-14 2 views
1

Oracle (8)에 패키지 변수가 있고 여러 트리거에서 호출 된 함수에서 수정 (증가)하면 한 번에 여러 번 함수가 호출 될 수 있습니까?Oracle 패키지 변수의 안전성

특히 비즈니스 트랜잭션에는 시퀀스 번호가 있으므로 특정 세션에 대해 시퀀스의 다음 숫자를 반환하는 함수가 있고 시퀀스 번호를 나타내는 패키지 변수를 증가시키는 함수가 있습니다. 기본적으로, 함수는 같은입니다

function get_seq_num return number is 
    ret number; 
begin 
    if g_seq_num is not null then 
    ret := g_seq_num; 
    g_seq_num := g_seq_num + 1; 
    else 
    g_seq_num := 1; 
    end if; 
    return ret; 
end get_seq_num; 

이 주어진 트랜잭션에 대해 같은 seq_num를 기록하는 시도를 트리거 것으로 보인다, 내가 확실히 (그들은 내가 그들이 생각하는 동시에 실행하지 않으면 밖으로 왜 작동하지 않을 수 있습니다 하지 않을 것이다).

** 주 1 : 공식적으로, 이것은 내가 상속과 상관없이이를 변경하지 않는 위치에 아마 나는 한 레거시 코드가 얼마나 나쁜 그것이 연습 ....

** 비고 2 : 함수가 여러 번 동시에 실행될 수 있다고 생각하지 않기 때문에 record_seq_num이 다른 곳에서 업데이트 될 수 있는지 여부를 조사하고 있습니다 ...

+0

'g_seq_num '의 현재 값이'NULL '이면 함수가'NULL '을 반환합니다. 패키지 변수가 NULL이 아닌 값으로 초기화 된 경우 이것이 바람직한 동작인지 또는 어쩌면 결코 발생하지 않을지는 모르겠지만 이상하게 보입니다. –

답변

2

질문에 대한 대답은 정렬이라고 생각합니다. of, 예.

각 데이터베이스 세션은 패키지 변수의 자체 복사본을 가져옵니다. 세션 간에는 공유되지 않습니다. 당신이 설명한 것은 시퀀스를 만드는 안전한 방법이 아닙니다. 해당 함수를 여러 번 실행하는 세션이 하나있는 경우 해당 패키지 변수의 복사본은 증가하지만 다른 세션은 증가하지 않습니다. 세션 A가 1, 2, 3을 반환하고 세션 B가 1을 반환 할 가능성이 있습니다.

또한 세션이 닫히거나 패키지가 다시 컴파일 될 때 패키지 변수가 삭제됩니다. 여기

는 당신은 오라클 sequence을 사용한다 "Global variable across different sessions"

톰의 질문입니다.

+0

아마도 나는 명확하지 않았습니다 ... 전체 목표는 세션에서 독립적으로 수행하는 것입니다. 각 세션에는 고유 한 TXN_ID (시퀀스에서 설정)가 있지만 각 트랜잭션에는 여러 단계가 있습니다 (이 시퀀스 번호를 사용하는 곳). 예를 들어 세션 A는 Txn_id 12345 (시퀀스에서)와 트랜잭션 로그 내의 특정 이벤트를 Seq_num 1,2,3,4 ....로 가져옵니다. 세션 B는 TXN_ID 12346을 얻지 만 seq_num 1,2,3을 기록합니다. 문제는 SEQ y와 TXN x의 중복이있는 것 같습니다. Ask Tom 참고 자료를 살펴볼 것입니다. – user679560

+0

아, 그게 다릅니다. 다른 세션의 동일한 TXN_ID를 사용하여 패키지를 호출 할 수 있습니까? 아니면이 모두가 동일한 트랜잭션의 것입니까? – eaolson

+0

정확히 무슨 일이 일어나고 있는지, 그냥 깨닫지 못했던 문제 (건배)를 발견했습니다. 두 번째 함수는 "SELECT max (Seq_Num) from where tXN_ID = x"를 사용하여 어디에서 작업했는지를 확인하고 거기에서 물건을 추가했습니다. 그 시점에서 커밋이 이루어지지 않았기 때문에, 우리는 처음부터 시작해서 우리가 이미 가지고있는 값을 삽입하려한다고 가정합니다 .... – user679560

관련 문제