이 기사의 주요 연구는 다음과 같이 스프링 트랜잭션 격리 수준의 소개 및 예입니다.
동일한 데이터베이스에서 레코드에서 두 트랜잭션이 작동하면 그 사이의 영향은 무엇입니까? 이것은 트랜잭션 격리 수준의 개념을 불러 일으 킵니다. 데이터베이스의 분리는 동시성 제어와 많은 관련이 있습니다. 데이터베이스의 격리 수준은 데이터베이스의 트랜잭션 특성의 산의 일부입니다. 산, 즉 원자력, 일관성, 분리 및 내구성. Spring에는 4 개의 트랜잭션 격리 수준이 있습니다 : READ_UNCOMMITTED , READ_COMMITTED , REPEATABLE_READ 및 SERIALIZABLE . 다른 하나는 데이터베이스 DEFAULT 의 기본 격리 레벨이며 MySQL은 REPEATABLE_READ 로 기본값입니다.
아래에서 자세히 살펴 보겠습니다.
이름에서 알 수 있듯이 READ_UNCOMMITTED 한 트랜잭션이 다른 트랜잭션이 커밋되지 않았다는 트랜잭션 레코드를 읽을 수 있음을 의미합니다. 다시 말해, 트랜잭션은 다른 거래에서 여전히 커밋되지 않은 데이터를 읽을 수 있습니다. 이것은 스프링 트랜잭션의 가장 약한 격리 수준입니다. 아래 그림을 참조하십시오. 트랜잭션 A가 켜지고 레코드가 작성됩니다. 현재 트랜잭션 B는 데이터를 읽고이 레코드를 읽고 트랜잭션 A가 롤백됩니다. 따라서 트랜잭션 B에 의해 읽은 데이터는 유효하지 않습니다 (데이터베이스는 유효하지 않은 상태입니다). 이 상황을 Dirty Read라고합니다. 더러운 읽기 문제 외에도 READ_UNCOMMITTED non-repeatable read (반복적 인 독서가 아님) 및 phantom read (Phantom Reading)를 가질 수 있습니다.
READ_COMMITTED 격리 수준은 트랜잭션이 커밋 된 레코드 만 읽을 수 있으며 커밋되지 않은 레코드를 읽을 수 없음을 나타냅니다. 다시 말해, 트랜잭션은 커밋 된 데이터 만 읽을 수 있으며 커밋되지 않은 데이터를 읽을 수 없습니다. 따라서 더러운 읽기 상황은 더 이상 발생하지 않지만 다른 문제가 발생할 수 있습니다. 아래 그림을 참조하십시오.
트랜잭션 A의 읽기 사이에서 트랜잭션 B는 해당 기록을 수정하고이를 수정합니다. 따라서 트랜잭션 A 전후에 읽은 레코드는 일관성이 없습니다. 이 문제를 반복 할 수없는 읽기라고합니다 (반복적으로 읽을 수 없습니다). (기록은 두 번 사이에 일관되지 않게 읽히고 반복 된 판독 값이 문제를 발견 할 것입니다.)
반복 할 수없는 읽기 문제 외에도 READ_COMMITTED 팬텀 읽기 문제가있을 수 있습니다.
REPITABLE_READ는 트랜잭션이 데이터베이스에서 여러 번 레코드를 읽을 수 있고 레코드는 여러 번 읽습니다. 동일합니다. 이 격리 수준은 더러운 읽기 및 반복 할 수없는 읽기 문제를 피할 수 있지만 팬텀 읽기 문제가 발생할 수 있습니다. 아래 그림과 같이.
트랜잭션 a는 데이터베이스의 일련의 레코드를 두 번 읽습니다. 그 동안 트랜잭션 B는 레코드를 삽입하고 제출합니다. 트랜잭션 A가 두 번째로 읽히면 트랜잭션 B가 방금 삽입되었다는 레코드가 읽을 것입니다. 거래 중에 트랜잭션 A에 의해 읽은 일련의 레코드는 일치하지 않으며이 문제를 Phantom Read라고합니다.
직렬화 가능한 것은 Spring의 가장 강력한 분리 수준입니다. 거래가 실행되면 거래가 함께 일어나지 않고 연쇄 방식으로 수행되는 것처럼 읽기 및 쓰기 시점과 같은 모든 수준에서 잠겨 있습니다. 이것은 더러운 읽기, 반복 불가능 읽기 및 팬텀 읽기를 방지하지만 성능 저하를 유발합니다.
MySQL은 REPEATABLE_READ 로 기본적으로 기본적으로 나타납니다.
아래 예를 살펴 보겠습니다. 데이터베이스 MySQL에서 트랜잭션을 열고 커밋하지 않습니다. 그런 다음 다른 거래에서 레코드를 읽습니다.
처음에는 데이터베이스의 레코드가 그림과 같이 표시됩니다.
다음으로 데이터베이스 MySQL에서 트랜잭션 A를 열고 레코드를 삽입하십시오.
서비스 내 서비스 클래스의 트랜잭션 속성은 READ_UNCOMMITTED 로 구성됩니다.
@transactional (분리 = 격리. 절연 .Read_UncicMitted) 공공 클래스 계정 서비스 {private AccountDao AccountDao; public arc {Acc다음 테스트 클래스를 실행하십시오
package com.chris.service; import static org.junit.assert.*; import org.junit.test; import org.junit.runner.runner.runwith; import org.spramframework.beans.annotation.autowired; import org.springframework.test.context.contextonfigation; org.springframework.test.context.junit4.springjunit4classrunner; @runwith (springjunit4classrunner.class) @contextConfiguration ( "classPath : ApplicationContext.xml") public readallusertest {@autowired ac {accountservice.readalluser ();}}결과는 다음과 같습니다.
이 트랜잭션은 커밋되지 않은 데이터를 읽는다는 것을 알 수 있습니다.
현재 MySQL에서 열린 트랜잭션 A를 롤백하십시오.
mysql> 롤백;
프로그램을 다시 실행하면 결과가 있습니다
계정 [name = michael, money = 1000.0]
계정 [이름 = 제인, 돈 = 1000.0]
계정 [이름 = 케이트, 돈 = 1000.0]
위는 스프링 트랜잭션 격리 수준 소개 및 예제 분석에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!