donaricano-btn

BusinessLayer_1


1. 트랜잭션

1) 요청에 걸친 트랜잭션

- 롱트랜잭션, 약한결합 트랜잭션이라 한다

- 여러 요청에 걸친 트랜잭션

- 애플리케이션 설계 혹은 시스템 운영으로 대응

- 올라인으로 책을 구입해서 집으로 배송되고 은행에서 대금이 인출


2). 요청 안에서 트랜잭션

- 쇼트 트랜잭션, 밀결합 트랜잭션

- 데이터소스가 하나일때는 로컬 트랜잭션, 여러개에 걸칠 때는 글로벌 트랜잭션

- 스프링 트랜잭션 기능을 이용

- 주문확정 요청을 받아 발주 테이블과 고객테이블, 재고 테이블이 갱신


1_1. 트랜잭션의 경계

- 트랜잭션의 경계는 프레젠테이션 층비즈니스 로직 층 사이에 있다

- 컨트롤러에서 서비스 클래스의 메소드가 호출되면 시작

- 서비스 클래스의 메소드를 마치고 컨트롤러로 되돌아 갈 때가 트랜잭션 종료


1_2. 트랜잭션 처리를 구현하는 장소 문제

비즈니스 로직 안에서 트랜잭션 처리 문제점

1) transfer()는 프레젠테이션 층에 공개된 서비스의 메소드인 트랜잭션 경계이다

2) 이체 서비스 옆은 DAO이며 계좌의 잔고를 갱신하는 updateZandaka()가 있다

3) transfer()에서 updateZandaka()를 각각 호출한다

4) 비즈니스 로직안에서 커넥션 취득이나 커밋/롤백을 호출할 필요가 있다

5) 은폐되어야할 JDBC의 API에 비즈니스 층이 의존하게된다

1_3. AOP를 이용한 트랜잭션 처리

- 선언적 트랜잭션 구현

- AOP로 서비스에 어드바이스를 적용함

- 스프링이 제공하는 트랜잭션 매니저와 어드바이스 사용


2. 트랜잭션 매니저

- 트랜잭션 시작과 종료, 롤백 처리를 비롯해 트랜잭션의 정의정보를 세밀하게 설정함

- 데이터 엑세스기술을 은폐해 기술이 바뀌어도 같은 방법으로 매니저 사용


2_1. 트랜잭션 정의 정보

- 트랜잭션 매니저로 설정할수 있는 정의 정보

a. 전파(Propagation) 속성

b. 독립성 수준

c. 시간만료

d. 읽기전용상태(Read-Only Status)

e. 롤백 대상 예외

f. 커밋 대상 예외

1) 전파 속성

- 트랜잭션의 전파 방법을 설정하는 속성

1 : 컨트롤러 1에서 서비스 1을 호출, 트랜잭션은 서비스1의 메소드가 호출되었을 때 시작

2 :  컨트롤러 2에서 서비스2를 호출하고 서비스2에서 서비스 1을 호출

- 서비스2의 메소드가 호출 될 때 트랜잭션 시작, 그 트랜잭션 안에서 서비스1 호출

- 서비스 1이 호출되면 동시에 트랜잭션을 새로 시작할지 아니면 원래 트랜잭션(서비스2) 그대로 이어갈지 선택 해야한다

- 이런 선택을 우린 전파속이라 한다

전파 속성의 종류

전파속성

서비스 1에 대해 설정했을 시 

1경우

2경우 

 PROPAGATION_REQUIRED

트랜잭션을 시작  

서비스 2의 트랜잭션의 참가 

PROPAGATION_REQUIRES_NEW 

트랜잭션을 시작 

새 트랜잭션을 시작 

PROPAGATION_SUPPORTS 

트랜잭션을 하지 않는다 

서비스2의 트랜잭션의 참가 

PROPAGATION_MANDATORY 

예외릐 던진다. 

서비스2의 트랜잭션에 참가 

PROPAGATION_NESTED 

트랜잭션을 시작 

부분적인 트랜잭션을 시작 

PROPAGATION_NEVER 

트랜잭션 하지 않는다 

예외를 던진다

PROPAGATION_SUPPORTED 

트랜잭션 하지 않는다 

트랜젹션을 하지 않는다 

개발에서는 기본적으로 PROPAGATION_REQUIRED로 문제 없다


2) 독립성 수준

- 트랜잭션 처리가 병행해서 실행될 때 의 각 트랜잭션의 독립성을 결정하는 것이다

- Example

a. 트랜잭션 1과 트랜잭션 2과 나란히 실행됨

b. 트랜잭션1이 무엇인가 데이터베이스의 레코드를 갱신 했다고 한다, 단 트랜잭션 도중이므로 아직 커밋 안함, 오류가 일어난다면 롤백해서 불안정한 상황

c. 트랜잭션 2는 1의 갱신한 데이터를 읽어 오려한다, 읽어 오려는 데이터는 커밋되지 않은 불확정한 상태 이다

d. 이때 트랜잭션2는 갱신된 데이터를 읽어와도 되는가?

e. 모순 되지 않게 하려면 트랜잭션1이 커밋해서 확정된 후에 데이터를 읽어와야 한다

f. 트랜잭션1과 2과 나란히 실행될 때 모순되지 않게 처리하는 속성이 독립성 이다

- 독립성 수준의 종류

 독립성 수준

의미 

ISOLATION_READ_COMMITED

다른 트랜잭션이 변경했지만 아직 커밋하지 않은 데이터는 읽을 수 없다 

ISOLATION_READ_UNCOMMITED 

다른 트랜잭션이 변경하고 아직 커밋하지 않은 데이터는 읽을 수 있다 

ISOLATION_REPEATABEL_READ

트랜잭션 내에서 여러번 데이터를 읽어올 때, 다른 트랜잭션이 도중에 데이터를 갱신해도 같은 값을 읽어온다 

ISOLATION_SERIALIZABLE 

트랜잭션을 하나씩 순서대로 처리해서 독립시킨다 

ISOLATION_DEFAULT 

데이터베이스가 제공하는 기본 독릭성 수준을 이용한다 

- 데이터가 모순되는 3가지 상태

a. Dirty Read

- 다른 트랜잭션이 변경했지만, 아직 커밋하지 않은 데이터를 읽어내는 것이다.

b. Unrepeatable Read

- 트랜잭션 내에서 같은 데이터를 여러번 읽을 때, 다른 트랜잭션이 해당 데이터를 변경하면 이전에 읽은 데이터와 다른 데이터를 읽어내는 것

c. Phantom Read

- 트랜잭션 내에서 같은 데이터를 여러번 읽을 때, 다른 트랜잭션이 새로운 레코드를 추가하면 이전에 없던 레코드를 읽어 내는것

- 독립성 수준과 데이터 모순 상태

독립성 수준 

Dirty Read 

Unrepeatable Read 

Phantom Read 

ISOLATION_READ_UNCOMMITTED 

O 

O 

O 

ISOLATION_READ_COMMITED 

X 

O 

O 

ISOLATION_REPEATABLE_READ 

X 

X 

O 

ISOLATION_SERIALIZABLE 

X 

X 

X: 허용안함, O: 허용

- 아래로 갈수록 독립성 수준이 높다.

- 독립성이 강해지면 성능이 나뻐진다.

- Example

과자 가게 아줌마가 한번에 아이들에게 과자를 팔면 200원이 모자란다. 그래서 한줄로 세우고 순서대로 계산하면 계산은 맞지만 시간이 오래걸린다



'Back-End > SpringFrame_1' 카테고리의 다른 글

[Spring] PresentationLayer_1  (0) 2016.08.08
[Spring] BusinessLayer_2  (0) 2016.08.07
[Spring] DataAccessLayer_2  (0) 2016.07.31
[Spring] DataAccessLayer_1  (0) 2016.07.25
[Spring] AOP_2  (0) 2016.07.20
블로그 이미지

리딩리드

,