봄의 트랜잭션 격리 및 전파

선언적인 트랜잭션
(1) 프로그램의 트랜잭션
코드 작성 트랜잭션 제어 프로그래머에 의한
예는 프로그램 거래 OpenSessionInView 인
이 선언적인 트랜잭션
트랜잭션 제어 코드가 스프링에 의해 작성되었습니다, 프로그래머는 트랜잭션 제어를 필요로하는 방법을 선언 할 필요와 업무를 제어하는 방법
3 선언적 트랜잭션은 클래스 ServiceImpl에서는 메소드로 연결됩니다
ServiceImpl에서는 클래스 아래 방법에 관한되는 선언적인 트랜잭션
알림 (통보)의 트랜잭션 기반의 관리자
여섯 선언적 트랜잭션 속성 해석에
필요한 방법 1 개 이름 = "" * 와일드 카드 지원 트랜잭션 제어,
(2) 읽기 전용 =이 읽기 전용 트랜잭션이 있는지 여부 "부울"
는 데이터베이스 트랜잭션을 말하고, true의 경우는 읽기 전용 업무는, 총무에 가입하지 않습니다 잠금, 성능 업그레이드를해야합니다, 질의 방법은,이 권장됩니다 이 속성의 사용
반대로 읽기 전용 트랜잭션 데이터베이스 및 트랜잭션 프로세스가 트랜잭션을 커밋, 다른 것입니다 커밋, 데이터베이스 관리 시스템이 잠금 장치 및 기타 문제의 시리즈를 추가 한 것이다 읽기 전용 트랜잭션
이 false 인 경우, 그 거래는 거래를 제출해야 , 추가, 삭제, 낮은 기본 값 FA를 사용하여 작업을 수정하는 것이 좋습니다 LSE

 트랜잭션 속성

당신이 거래에게 어떤 경우를 선언 할 때, 우리는 @Transactional (읽기 전용 = false를 전달 = Propagation.REQUIRED)을 사용했다.

중동 매개 변수 readOnly 인은, 전파 우리는 트랜잭션 속성을 호출합니다. 이 거래의 기본 구성입니다. 통신 행동, 격리 수준, 트랜잭션 타임 아웃, 롤백 규칙, 읽기 전용 여부 : 트랜잭션 속성은 5 개 영역입니다.


우리는 네 가지 기본 트랜잭션 속성으로 돌아가려면, 인터페이스 TransactionDefinition의 속성을 볼 수 있습니다 :

공용  인터페이스 TransactionDefinition {
 INT getPropagationBehavior (); // 전파 행동. 
INT getIsolationLevel (); // 격리 수준. 데이터가이 거래에서 볼 수있는 또 다른 트랜잭션을 제어하는 트랜잭션 (transaction) 매니저. 
INT getTimeout에서는 (); // 거래는 초 이내에 완료해야합니다. 
부울 isReadOnly의 (); // 트랜잭션이 읽기 전용인지 여부. 트랜잭션 관리자는 트랜잭션이 읽기 전용되도록하여 리턴 값에 따라 최적화 될 수있다 
}

트랜잭션 격리 수준 (격리 수준)에 대한이 이야기
데이터베이스는 다음 불확실 다음과 같은 상황이 데이터베이스 작업 중 발생할 수 있습니다, 고객 방문의 대다수에 의해 공유 할 수있다.

업데이트 손실 (손실 갱신)
두 트랜잭션이 동시에 자신의 데이터를 업데이트는 트랜잭션이 적용되는 데이터를 다른 트랜잭션 업데이트에 데이터를 업데이트합니다. 예를 들어, CMS 시스템은 모두 개방은 동시에 한 사람이 먼저 업데이트 손실의 결과 첫 번째의 내용을 저장 표지에 사람을 저장 한 후, 다른 후 저장, 저장, 기사를 수정합니다.
동시 트랜잭션이 고립되지 않도록 시스템이 모든 작업 잠금을 수행하지 않기 때문입니다. 동시 트랜잭션에 의해 발생하는 문제는 "손실 업데이트는"일반적으로 완전히 피해야한다. 그러나 손실 업데이트를 방지하고, 따라서, 해결하는 데 필요한 잠금을 추가 업데이트 할 데이터를 필요로 손실 업데이트가 응용 프로그램의 책임이어야한다 방지 주소 응용 프로그램 데이터베이스 트랜잭션 컨트롤러에 의존 할 수 없습니다.

더러운 읽기 (더티 읽기)
다른 작업 결과 데이터 커밋되지 않은 트랜잭션에 읽기 거래. 이 모든 작업이 롤백됩니다 가능성이 있기 때문에, 매우 위험합니다.

비 반복 읽기 (비, 반복 읽기)
읽기 트랜잭션이 동일한 데이터 라인에 두 번 반복하지만 서로 다른 결과를 얻을 수 있습니다. 데이터 트랜잭션 T1을 읽은 후 예를 들어, T2는 트랜잭션 데이터가 다시 판독 될 때 이전 트랜잭션 T1의 다른 값을 획득하도록 수정되었다. 또한 가상 읽기라고도합니다.

매직 독서 (팬텀 읽기)
이 두 가지를 필요로하지 않는다 (두 번째 쿼리의 결과가 첫 번째 데이터 쿼리에 표시하거나 첫 번째 쿼리에 나타나는 누락 된 데이터를하지 않는 포함, 작동시 거래 두 쿼리를 SQL 문에서 같은 쿼리). 두 쿼리의 과정에서 발생하는 다른 트랜잭션 데이터를 삽입 있기 때문이다.

비 반복 읽기 초점을 기록 필드를 수정하는 것입니다, 팬텀 초점은 신규 또는 삭제 기록입니다 읽어 보시기 바랍니다.
전자의 경우, 단지 기록 조건이 충족 잠급니다. 후자의 경우, 조건은 잠그고 녹음을 닫습니다.

"반복 불가능한 읽기 '와'팬텀 읽기" "더러운 읽기", 실제로 데이터베이스 일관성 문제를 읽고, 그것을 해결하기 위해 데이터베이스 트랜잭션 격리 메커니즘을 제공해야합니다.

트랜잭션 격리 수준
은 표준 SQL 규격 위에 표시 낮은에서 읽기 커밋 된 최고에, 네 개의 트랜잭션 격리 수준을 정의하는 것을 피하기 상황에 순서는, 읽기 최선을 다하고, 반복 읽기 , 직렬화, 네 개의 레벨이 하나 하나 해결 될 수있다 더러운 팬텀 이러한 유형의 문제를 읽고, 비 반복 읽기, 읽습니다.


확약 읽기 (읽기 커밋되지 않은)
봄 정체성 : ISOLATION_READ_UNCOMMITTED. 더러운 읽기하지만 업데이트를 손실 할 수 있습니다. 트랜잭션 데이터를 쓰기 시작 된 경우, 다른 트랜잭션을 동시에 쓸 수 있지만, 다른 트랜잭션이 여행의 데이터를 읽을 수있다. 분리 레벨을 달성하기 위해 "독점 쓰기 잠금"이 될 수 있습니다.

읽기 (커밋 된 읽기) 최선을 다하고
ISOLATION_READ_COMMITTED : 봄 ID를. 반복 할 수없는 읽기가 아니라 더러운 읽기 수 있습니다. 이 "즉시 공유 읽기 잠금"을 달성하기 위해 "독점 쓰기 잠금"이 될 수 있습니다. 데이터 읽기 트랜잭션은 다른 트랜잭션이 데이터 행에 계속 액세스 할 수 있지만 행을 액세스하는 다른 트랜잭션을 방지 할 수 커밋되지 않은 트랜잭션을 작성할 수 있습니다.

반복 읽기 (반복 읽기)
봄 식별 : ISOLATION_REPEATABLE_READ. 금지 된 비 반복 읽기와 더러운 읽기,하지만 때로는 팬텀 읽기 데이터가 발생할 수 있습니다. "공유 읽기 잠금"및 구현을 통해이 "독점 쓰기 잠금". 데이터 읽기 트랜잭션이 쓰기 트랜잭션 (하지만 읽기 트랜잭션을 허용)에 의해 금지 될 것입니다, 쓰기 트랜잭션은 다른 트랜잭션을 금지합니다.

직렬화 (직렬화)
봄 식별 : ISOLATION_SERIALIZABLE. 엄격한 트랜잭션 격리를 제공합니다. 그것은 트랜잭션의 직렬화를 요구, 트랜잭션이 아니라 동시에보다, 하나에 의해 수행 될 수있다. 만 "행 수준 잠금"을 달성 할 수없는 트랜잭션 직렬화를 통해, 그것은 새로 삽입 된 데이터를 단지 다른 메커니즘을 통해에 트랜잭션 쿼리 액세스를 실행되지 않도록해야합니다.

높은 격리 수준은, 더는 데이터의 무결성과 일관성을 보장 할 수 있지만, 동시 성능에 미치는 영향도 크다. 대부분의 응용 프로그램, 데이터베이스 시스템은 최선을 다하고 읽기에 격리 수준에 우선 순위를 부여 할 수 있습니다. 더러운 읽기 방지 할 수있다,뿐만 아니라 더 나은 동시 성능을 가지고있다. 이 비 반복 읽기로 이어질 것입니다 만, 팬텀 읽고 II는 응용 프로그램이 비관적 잠금 또는 제어에 대한 낙관적 잠금을 사용하여 만들 수 있습니다 이러한 문제가 발생할 수 있습니다 각각의 경우에 이러한 동시성 문제 업데이 트를 잃었다.

봄은 동시에 정체성을 제공 : ISOLATION_DEFAULT을. 그것은 기본 격리 수준을 사용하여 백 엔드 데이터베이스를 나타냅니다. 대부분의 데이터베이스 기본 트랜잭션 격리 수준은 읽기는 SQL 서버, 오라클로, 최선을 다하고 있습니다. MySQL의의 기본 격리 수준은 반복 읽기입니다.

다음은 우리가 지금 트랜잭션 전파 레벨의 전파를 도입, 분리하다

전파 값은 다음과 같다 :
필수 : (기본값) 현재 트랜잭션에서 실행되는 트랜잭션을 가지고있는 경우, 트랜잭션 (transaction), 새로운 트랜잭션의 경우
지원 당신은 현재 트랜잭션 (transaction)의 경우, 비의 트랜잭션에서 실행되는 트랜잭션을,있는 경우 다음 트랜잭션 상태
의무적 : 당신은 현재 트랜잭션에서 실행 트랜잭션이있는 경우, 트랜잭션 내에서 실행되어야합니다 어떤 거래, 직접 오류가없는 경우
Required_NEW : 그것은, 트랜잭션 내에서 실행해야합니다 당신이 현재있는 경우, 트랜잭션 (transaction), 새로운 트랜잭션, 경우 거래, 현재의 트랜잭션 (transaction) 계류중인
NOT_SUPPORTED : 현재 트랜잭션이있는 경우에는 거래, 정상적인 실행이, 현재의 트랜잭션 (transaction)가 응답하지 않을 경우 비 트랜잭션에서 수행해야합니다
비 트랜잭션 상태에서 수행해야합니다, 트랜잭션 (transaction)가있는 경우 : 결코 현재 트랜잭션이있는 경우, 정상적인 실행, 오류가
중첩 : 어떤 거래, 새로운 트랜잭션을, 존재하지 않는 경우는 거래 실행해야 상태, 현재의 트랜잭션 (transaction)가 중첩 된 트랜잭션을 생성 한 경우

추천

출처www.cnblogs.com/qyx66/p/12116759.html