>  기사  >  데이터 베이스  >  Spring 트랜잭션과 선언적 트랜잭션 사용을 이해하는 방법

Spring 트랜잭션과 선언적 트랜잭션 사용을 이해하는 방법

坏嘻嘻
坏嘻嘻원래의
2018-09-15 11:27:081903검색

이 기사의 내용은 데이터베이스의 격리 수준을 포함하여 Spring 트랜잭션을 이해하는 방법과 특정 참조 가치가 있는 친구가 참고할 수 있기를 바랍니다. 당신에게.

spring 트랜잭션과 선언적 트랜잭션의 사용

(학생 여러분, 대학에서 교사에게 제공한 데이터베이스 지식을 검토하십시오!!)

트랜잭션: 데이터베이스의 다양한 데이터 항목에 액세스하고 업데이트할 수 있는 프로그램 실행 단위.

트랜잭션에는 네 가지 속성이 있습니다: (ACID)

원자성: 트랜잭션은 분할할 수 없는 작업 단위이며 트랜잭션에 포함된 모든 작업은 완료되거나 전혀 수행되지 않습니다.

일관성; 트랜잭션은 데이터베이스를 한 일관성 상태에서 다른 일관성 상태로 변경해야 합니다. 일관성과 원자성은 밀접한 관련이 있습니다.

격리: 거래 실행은 다른 것에 의해 방해받을 수 없습니다. 즉, 트랜잭션에서 사용되는 내부 작업과 데이터는 다른 동시 트랜잭션과 격리되어 동시에 실행되는 트랜잭션이 서로 간섭할 수 없습니다.

지속성: 영속성이라고도 불리는 지속성은 트랜잭션이 제출되면 데이터베이스의 데이터 변경 사항이 영구적이어야 함을 의미합니다.

거래 목적: 데이터 일관성과 무결성을 유지합니다.

일관성: 비즈니스 체인의 데이터 상태는 일관되며 부분적으로 변경될 수 없고 부분적으로 변경되지 않습니다.

무결성: 비즈니스 체인의 데이터는 완료되고 동시에 실패하며 부분 쓰기는 성공할 수 없으며 부분 쓰기는 실패합니다.

일의 일관성과 무결성에 대한 간단한 이해는 우리가 함께 살거나 함께 죽거나 혼자 살 수 없다는 것입니다. (비참한 사랑처럼...^ _ ^)

데이터베이스의 트랜잭션 격리 수준

트랜잭션 격리 수준을 이해하기 전에 먼저 데이터에서 자주 발생하고 비즈니스 로직이 실패할 수 있는 몇 가지 상황을 이해해 보겠습니다.

Dirty Read

트랜잭션이 데이터에 액세스하고 데이터를 수정했으며 아직 데이터베이스에 제출하지 않은 경우 다른 트랜잭션도 해당 데이터에 액세스한 후 해당 데이터를 사용합니다.

예: Zhang San의 은행 계좌에 현재 1,000이 있고 이제 Zhang San이 200을 입금한 후 Zhang San이 제출을 클릭했을 때 그의 아내(아내를 위해 용돈을 아끼려고 열심히 일한)가 쇼핑몰에서 쇼핑하는 데 500을 썼습니다. 장삼은 잔액을 확인해보니 500밖에 되지 않았습니다(장삼은 혼란스러웠습니다...). 그러다가 두 사람은 200명이 넘게 다투었습니다. 과도한 독서로 인해 가족전쟁을 일으킨 것이 바로 위의 내용이다.

Non-repeatable read

Non-repeatable read: 트랜잭션 내에서 동일한 데이터를 여러 번 읽습니다. 이 트랜잭션이 종료되기 전에 다른 트랜잭션도 데이터에 액세스했습니다. 첫 번째 트랜잭션에서 두 번 읽은 데이터 사이에 첫 번째 트랜잭션에서 읽은 데이터는 두 번째 트랜잭션의 수정으로 인해 다를 수 있습니다. 이러한 방식으로 트랜잭션 내에서 두 번 읽은 데이터는 다릅니다. (즉, 동일한 데이터를 읽을 수 없음)

Phantom reading

A 트랜잭션은 테이블의 데이터를 수정하며, 이 수정에는 테이블의 모든 데이터 행이 포함되며 동시에 두 번째 트랜잭션이 테이블 A에 삽입됩니다. 새로운 데이터 행. 첫 번째 트랜잭션을 수행하는 사용자는 테이블에 아직 수정되지 않은 데이터 행이 있음을 발견하게 됩니다. 마치 환각 같았습니다.

spring의 5가지 격리 수준

ISOLATION_DEFAULT

은 기본 데이터베이스의 기본 격리 수준을 나타냅니다. 대부분의 데이터베이스에서 일반적인 값은 다음과 같습니다. ISOLATION _READ _COMMITTED

ISOLATION _READ _UNCOMMITTED

한 트랜잭션이 다른 트랜잭션을 읽을 수 있음을 나타냅니다. 수정되었지만 아직 커밋되지 않은 경우 더티 읽기 및 반복 불가능 읽기를 방지할 수 없습니다.

ISOLATION _READ _COMMITTED

트랜잭션은 다른 트랜잭션이 제출한 데이터만 읽을 수 있습니다. 더티 읽기는 방지할 수 있지만 반복 불가능한 읽기는 방지할 수 없습니다. (대부분의 경우 권장값)

ISOLATION _REPEATABLE _READ

트랜잭션은 전체 프로세스 동안 쿼리를 여러 번 반복적으로 실행할 수 있으며, 매번 반환되는 레코드는 동일합니다. 쿼리를 충족하기 위해 여러 쿼리 사이에 새 데이터가 있더라도 이러한 새 레코드는 무시됩니다. 더티 읽기(dirty read) 및 반복 불가능한 읽기를 방지할 수 있습니다.

ISOLATION _SERIALIZBLE

모든 트랜잭션은 순차적으로 하나씩 실행되므로 트랜잭션 간 간섭 가능성이 없습니다. 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기를 방지할 수 있습니다.

트랜잭션 전파(봄에는 7개 제공)

는 트랜잭션 간의 관계를 나타냅니다. 예를 들어 트랜잭션에 다른 트랜잭션이 포함되어 있으면 전파를 사용하여 상호 실행을 결정합니다.

TransationDefinition.PROPAGETION.REQUIRED

현재 거래가 있으면 거래에 참여하고, 현재 거래가 없으면 새 거래를 생성하세요.
봄의 기본 거래입니다. 대부분의 상황에 적합합니다.

TransationDefinition.PROPAGETION.REQUIRED_NEW

새 거래를 생성합니다. 현재 거래가 존재하는 경우 현재 거래를 일시 중지합니다.
원래 거래와 아무런 관련이 없는 새로운 거래를 생성한다는 의미입니다.

TransationDefinition.PROPAGETION.SUPPORTS

현재 트랜잭션이 있는 경우 트랜잭션에 참여하고, 현재 트랜잭션이 없으면 비트랜잭션 방식으로 계속 실행합니다.
이 방법은 없으면 없는 것, 있으면 있는 것입니다. 조금은 무관심한 태도입니다.

TransationDefinition.PROPAGATION.NOT_SUPPORTED

비트랜잭션 방식으로 실행됩니다. 현재 트랜잭션이 존재하는 경우 현재 트랜잭션이 일시 중지됩니다.
이 방법은 없으면 없을 것입니다. 있으면 지원하지 않을 것입니다.

TransationDefinition.PROPAGETION_NEVER

비트랜잭션 방식으로 실행하고 현재 트랜잭션이 존재하는 경우 예외를 발생시킵니다.
이 방법은 더 강력합니다. 아무것도 없으면 아무것도 없습니다. 그는 모든 사람에게 다음과 같이 선언했습니다.

TransationDefinition.PROPAGETION_MANDATORY

현재 거래가 있으면 거래에 참여하고, 현재 거래가 없으면 예외를 발생시킵니다.
이 방법은 가장 어렵다고 할 수 있습니다. 거래가 없으면 전 세계에 직접 오류가 보고됩니다.

TransationDefinition.PROPAGETION_NESTED

현재 트랜잭션이 있는 경우 현재 트랜잭션의 중첩 트랜잭션으로 실행할 트랜잭션을 생성합니다. 현재 트랜잭션이 없으면 값은
TransationDefinition.PROPAGETION_REQUIRED

선언적 트랜잭션

과 동일합니다.

사용 이제 springboot를 살펴보겠습니다. 선언적 트랜잭션을 사용하는 경우:

@Transactional
public void save(Object ob){

}

메서드에 @Transactional 주석 메서드를 추가하기만 하면 트랜잭션으로 관리할 수 있습니다.

소스 코드

주석의 소스 코드를 살펴보세요. 트랜잭션:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {

@AliasFor("transactionManager")
String value() default "";


@AliasFor("value")
String transactionManager() default "";

Propagation propagation() default Propagation.REQUIRED;

Isolation isolation() default Isolation.DEFAULT;

int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;


boolean readOnly() default false;

Class<? extends Throwable>[] rollbackFor() default {};


String[] rollbackForClassName() default {};

Class<? extends Throwable>[] noRollbackFor() default {};


String[] noRollbackForClassName() default {};

}

기본값

readOnly: 읽기 전용인지 여부. 기본적으로 읽기와 쓰기가 모두 가능합니다

timeout: 트랜잭션 시간 제한, 기본적으로 시간 제한 없음

isolation: 트랜잭션 격리 수준 기본값: TransactionDefinition.ISOLATION_DEFAULT(위 격리 수준 참조)

propagation: 트랜잭션 전파 속성 기본값: TransactionDefinition.PROPAGATION_REQUIRED

Notes

  • 주석은 공용 메서드에만 적용해야 합니다

  • 자체 호출 문제: 주석이 있는 메서드를 호출하기 위해 클래스에 주석이 달린 메서드가 없는 경우 외부 메서드가 주석이 없는 메서드를 호출하면 주석이 달린 메소드가 호출됩니다. 메소드는 트랜잭션을 생성하지 않습니다

위 내용은 Spring 트랜잭션과 선언적 트랜잭션 사용을 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.