내 응용 프로그램에 간헐적으로 교착 상태가 발생합니다. 신청서에 EMPLOYEE (ID (PK), NAME, SAL)과 같은 1 개의 테이블이 있으며 2 개의 세션이 있습니다.SELECT FOR UPDATE에서 데이터베이스 교착 상태가 발생했습니다.
세션 1 :
SELECT ID, NAME, SAL FROM EMPLOYEE WHERE SAL= (SELECT MIN(SAL) FROM EMPLOYEE) FOR UPDATE
Let say the query return EMPLOYEE ROW having ID=2
then application does some processing like rs.updateInt(ID_SAL, 10);
세션 2 : (다른 비즈니스 로직)
SELECT ID, NAME, SAL FROM EMPLOYEE WHERE ID=2 FOR UPDATE.
그래서, 응용 프로그램에서 두 세션이 동일한 행을 업데이트하려고 (예에서 ID와 행 = 2) 이러한 상황이 예상되므로 SELECT .. FOR UPDATE가 도움이 될 것이라고 생각합니다.
내가 잘못 했나요? 나는 SELECT FOR UPDATE가 행을 락하고 다른 세션이 같은 행을 업데이트하려고 할 때 세션 1이 완료 될 때까지 기다릴 것이라고 가정한다. 내가 UPDATE FOR SELECT는 행을 흔들 다른 세션이 동일한 행을 업데이트하려고 할 때, 그것은 세션까지 1 완료를 대기하는 있으리라 믿고있어
빠른 응답을 위해 Nicolai에게 감사드립니다. 예, 당신은 설명에서 정확합니다. 두 세션 모두 처리가 완료되면 트랜잭션을 커밋/롤백합니다. 즉 rs.updateRow()입니다. 세션 1에서 내 응용 프로그램 프로세스는 단 1 행 (참고 : 세션 1 쿼리는 여러 행을 반환 할 수 있지만 한 행만 처리합니다). 그리고 세션 2 쿼리는 항상 1 행을 반환합니다. –
가장 중요한 것은 두 프로세스에서 다른 레코드로 전환하기 전에 무료 (전체 트랜잭션 또는 세션 닫기) 레코드 또는 대량의 레코드입니다. – Nicolai