0

batchUpdate를 사용하여 Oracle 테이블에 삽입하고 있습니다. 5 개의 다른 병렬 스레드가 batchUpdate 메소드를 호출하여 단일 테이블에 삽입합니다. 테이블은 전역 임시 테이블 유형입니다.테이블 잠금을 발생시키는 Java의 MultiThreading

프로그램 실행이 완료되지 않아 데이터베이스 연결을 설정 한 후 프로그램이 실행되지 않습니다.

단일 글로벌 임시 테이블에서 작동하는 여러 스레드가 테이블 잠금을 야기하여 프로그램 실행을 유지합니까?

나는 잠긴 테이블이 예들은 것 질의 -

select object_name, object_type from all_objects where object_id in (select object_id from v$locked_object); 
+2

왜 5 개의 스레드입니까? 왜 하나의 스레드가 삽입 작업을 수행하고 다른 5 개의 "밀어 넣기"값을 처리하지 않을까요? – fge

+0

차단하거나 잠그고 있습니까? 첫 번째 스레드가 트랜잭션을 커밋한다고 가정하면 두 번째 스레드는 트랜잭션을 커밋 할 수 있어야합니다. 그렇지 않으면 데이터 풀이 다른 방법으로 작동합니다. –

+1

스레드가 각각 연결/세션을 갖고 있습니까? 아니면 동일한 세션을 공유하고 경쟁합니까? 실제로 GTT 인 경우 세션은 어쨌든 자신의 데이터 만 볼 수 있으므로 서로 intefere하지 않아야합니다. 어쩌면 하나의 스레드가 단일 연결을 보유하고 있고 다른 네 개의 스레드가 DB가 아닌 Java 수준에서 대기 중일 수 있습니까? –

답변

2

이하로 사용하여 볼 수 있습니다.

두 개의 다른 세션이 동일한 테이블을 동시에 업데이트하는 경우 첫 번째 테이블이 업데이트 (COMMIT 실행) 될 때까지 두 번째 세션이 테이블에 액세스 할 수 없습니다. 첫 번째 세션은 실제로 업데이트가 완료 될 때까지 해당 테이블에 'LOCK'을 배치합니다.

정확히 같은 시간에 정확하게 두 개의 스레드로 동일한 데이터 블록을 업데이트 할 수 없습니까?

데이터 일관성을 유지하는 것은 오라클 기능입니다.

+3

글로벌 임시 테이블을 업데이트하는 두 세션은 자신의 데이터 만 볼 수 있으므로 동일한 연결/세션에 액세스하는 다중 thres처럼 들립니까? 그것이 정말로 GTT라면. –

0

해당 쿼리의 출력을 보내주십시오. 오라클은 다양한 유형의 잠금을 지원합니다. 그 중 일부는 공유 할 수 있습니다 (예 : TM). v $ locked_object 뷰에서 무엇인가를 본다고해서 일부 세션이 차단되었다는 것을 의미하지는 않습니다.

대부분의 경우 테이블은 DDL (ALTER TABLE) 문에 대해서만 잠겨 있습니다. 그러나 DML에는 적합하지 않습니다.