문제

나는 최대 절전 모드 뒷면 JPA를 지속성 층으로 사용하고 있습니다. 비누 호출에서 데이터를 집계 한 다음 데이터베이스에 행을 저장하는 다중 스레드 프로세스가 있습니다. 이 과정은 일반적으로 약 700 행을 삽입하고 약 1-3 시간이 걸리며 비누 호출은 주요 병목 현상이됩니다.

이 전체 프로세스 동안 테이블은 잠금 장치에 삽입되어 적시에 선택 문을 반환하지 않습니다.

SQL Server 오류는 다음과 같습니다.

오류 메시지 : 잠금 요청 시간 출력 기간이 초과되었습니다.

이 긴 프로세스에서 데이터베이스 테이블을 잠그는 것을 어떻게 피합니까?

도움이 되었습니까?

해결책

700 행을 모두 삽입합니까? 같은 거래?

거래 경계는 어디에 있습니까? 트랜잭션 경계를 낮출 수있는 경우, 즉, 실제 삽입 작업만으로도 잠금 장치가 brielfy가 보유됩니다.

전체 프로세스가 원자력이 되려면 임시 테이블에 작성한 다음 메인 테이블에 삽입하기 위해 벌크 삽입 (빠른)을 수행하는 아이디어 일 수 있습니다.

다른 팁

아마도 격리 수준을 변경해야 할 것입니다.

다음은 몇 가지 정보입니다.http://www.interview-questions-forum.net/index.php/your-questions-on-java/jdbc-transaction/transaction-isolation-levels

그것은 서로 다른 격리 수준과 그들이 보호하는 데 도움이 될 수있는 것에 대해 이야기합니다. 이를 수행하는 일반적인 방법은 Strictist로 시작한 다음 더 나은 응답 시간이 필요하면 데이터 무결성/오 탐용의 요구 사항을 염두에두고 낮게 진행하는 것입니다.

편집하다

스프링 트랜잭션 수준은 트랜잭션 관리자의 JDBC (또는 무엇이든) 트랜잭션 격리 수준을 추상화하는 데 사용됩니다. 그것들은 거래 정의 수업, 정적 회원입니다.

TransactionDefinition.ISOLATION_DEFAULT
Default isolation

TransactionDefinition.ISOLATION_READ_UNCOMMITTED
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions

TransactionDefinition.ISOLATION_READ_COMITTED
Cannot read uncommitted data

TransactionDefinition.ISOLATION_REPEATABLE_READ
Ensures repeatable reads

TransactionDefinition.ISOLATION_SERIALIZABLE
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially.

거래 전파 수준도 있습니다. 과잉 읽기 일 수있는 순수 읽기에 거래를 사용하고있을 수 있습니다. 읽기는 거래가 필요하지 않으며, 쓰기는 항상 그 주위에 거래가 있어야합니다. 전파 수준은 TransactionDefinition에서도 명확합니다. 이들은 일반적으로 스프링 배선 파일에서 특정 통화의 직렬화 및 전파를 정의하는 데 사용됩니다. 배선의 예가 있다면 더 많은 힌트/정보를 줄 수 있습니다.

하나의 JPA 거래에서 700 개의 비누 요청을 시도하고 있습니까? 그렇게하지 마십시오. :-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top