저장 프로시저 작성중 Select ... For Update(Lock)에 대해서 궁금한 점이 있어서
글을 올립니다.
Oracle 버전을 10g입니다.
저장 프로시저에서 사용하는 테이블은 총 4개입니다.
하지만 저장 프로시저 호출시 전달된 파라미터에 따라서 2개의 테이블만 사용합니다.
즉 4개의 테이블을 A,B/C/D라고 한다면 저장 프로시저 호출시 전달된 파라미터에 따라서
A/B, A/C, A/D 2개의 테이블만 사용합니다.
저장 프로시저의 로직을 설명드리면 호출시 전달된 파라미터를 이용해서
1. A 테이블에서 SELECT문의 WHERE 조건을 만족하는 레코드 개수(COUNT)를 조회한 다음
COUNT가 얼마를 초과하면 Exception을 발생시키고 저장 프로시저를 종료합니다.
2. 1번을 통과하면 역시 전달된 파라미터를 이용하여 B/C/D 테이블 중에 하나를 선택하여
특정 레코드(1개)의 컬럼 몇개를 조회한 다음 컬럼의 값을 체크합니다.
비지니스 로직에 따라 컬럼의 값을 체크한 다음 조건을 만족시키지 못하면
Exception을 발생시키고 저장 프로시저를 종료합니다.
3. 2번을 통과하면 B/C/D 테이블 중에 하나를 선택하여 특정 컬럼의 값을 조회한 다음
저장 프로시저에 선언된 변수에 임시로 저장합니다.
4. B/C/D 테이블 중에서 하나를 선택하여 선택된 테이블의 특정 컬럼의 값을
저장 프로시저 호출시에 전달된 또 다른 파라미터 값만큼
비지니스 로직에 따라서 +/- 시킵니다.
즉 Update 작업을 수행합니다.
5. 마지막으로 저장 프로시저 호출시 전달된 파라미터를 이용하여
A 테이블에 INSERT와 UPDATE 두개의 작업을 수행합니다.
위에서 말한 1부터 5까지의 로직이 하나의 프로세스일때
제가 궁금한 점은
1. 위 로직중 1, 2, 3번의 각 SELECT 쿼리에 For Update를 이용하여 Lock을 설정했을때
Lock 해제는 어떻게 하는지 궁금합니다.
2. 1, 2, 3번의 각 SELECT 쿼리에 설정된 각각의 Lock은 위 4, 5번 작업이 끝난 다음
한꺼번에 해제해야 하는게 맞나요? 아니면 각각의 Select 작업이 끝난다음 각각
Lock을 해제해야 하나요?
위에 설명한 로직중 1, 2, 3번은 각각의 함수를 작성하여 저장 프로시저 내부에서
호출하고 있습니다.