Spring ChainedTransactionManager 어떻게 사용해야 하나? 프로그래밍

Spring Data Commons 1.6에는 ChainedTransactionManager라는 것이 추가 돼 있다

하나의 애플리케이션에서 여러 데이터베이스에 접근할 때 @Transactional 애노테이션을 통해 트랜잭션을 잡아줄 때 여러 데이터소스(DataSource)의 트랜잭션 매니저(Transaction Manager)를 따로따로 지정해서 작업해야 한다.
사실 그렇게까지 어려운 일은 아니지만 확실히 복잡도가 높아지긴 한다. 그래서 편리하게 사용하라고 나온 것이 ChainedTransactionManager이다.
이는 여러 트랜잭션 매니저를 인자로 받아 @Transactional에 기본 트랜잭션 매니저로 등록시켜두면, 트랜잭션이 시작될 때 지정된 모든 트랜잭션 매니저의 트랜잭션을 동시에 시작시키고 메소드 종료시에 동시에 커밋(commit) 혹을 롤백(rollback)을 수행한다.

javadoc 문서에 보면 The configured instances will start transactions in the order given and commit/rollback in reverse order, which means the PlatformTransactionManager most likely to break the transaction should be the last in the list configured. A PlatformTransactionManager throwing an exception during commit will automatically cause the remaining transaction managers to roll back instead of committing.라고 나온다.
즉,
  • 지정된 순서대로 트랜잭션이 실행되고,
  • 지정된 역순으로 트랜잭션이 종료된다.
  • 다시말해, 에러를 내기 쉬운 트랜잭션을 마지막에 지정해서 트랜잭션 종료 작업이 최초로 호출되도록 해야한다

왜냐면, 에러를 낼 가능성이 높은 트랜잭션이 최초로 롤백이 돼야 그 뒤의 다른 트랜잭션도 따라서 롤백 되기 때문이다. ChainedTransactionManager는 단지 트랜잭션 시작과 종료를 동시에 해줄 뿐이지 Two Phase Commit을 지원하는게 아니라서 이미 다른 트랜잭션이 커밋된 상황에서 하나의 트랜잭션이 롤백 됐다고 해서 이미 커밋된 것들이 다시 롤백되지는 않는다. 따라서 가장 위험한 요소를 최초로 커밋/롤백 시도하도록 해야 한다.

그런데 문제가 여기서 끝나지 않는다.

Spring의 PlatformTransactionManager는 기본적으로 트랜잭션이 시작될 때 Connection을 확보한다. 여기서 실제로 해당 Connection의 사용여부는 중요하지 않다. 그냥 무조건 Connection을 확보한다.

ChainedTransactionManager가 firstTransactionManager와 secondTransactionManager를 묶은 상태일때, ServiceA가 firstTransactionManager의 데이터소스만 사용하는 작업을 하더라도 secondTransactionManager의 데이터소스의 커넥션까지 함께 물고 들어가게 된다.

이 상황이 되면 실제로 secondTransactionManager는 아무 하는 일도 없이 커넥션 고갈 상태에 빠질 수 있다. 게다가 secondTransactionManager에 참여하는 데이터소스의 최대 커넥션 갯수가 firstTransactionManager의 커넥션 갯수보다 더 적은 상황이라면 사태는 더욱 심각해진다.

따라서 최종적으로 봤을 때 ChainedTransactionManager에 참여하는 모든 DataSource의 최대 커넥션 갯수는 동일하게 맞춰주는 것이 좋다.

또한, Spring은 LazyConnectionDataSourceProxy라는 것을 제공해주고 있다.
이를 사용하면 트랜잭션 매니저에 의해 커넥션이 호출되더라도 실제로 커넥션이 사용되기 전까지 원본 데이터소스에 커넥션 요청을 미룸으로써 불필요한 커넥션 생성 요청을 방지해준다. 따라서 CTM 으로 묶여있는 데이터소스들이 사용도 안되는 커넥션 요청으로 커넥션 고갈을 겪는 문제를 완화시켜준다.

LazyConnectionDataSourceProxy는 ORM 사용시 캐시 히트율이 높아서 ReadOnly 트랜잭션은 시작했으나 정작 DB에 한번도 액세스하지 않는 상황이 될 때도 매우 유용하다.

위 사항은 직접 테스트를 해보았다.

ChainedTransactionManagerTest에서 테스트 코드와 결과를 볼 수 있다.

공유하기 버튼

 
 

Xubuntu 14.04 설치기 리눅스/Unix 이야기

요즘은 리눅스 그 중에서도 특히 Ubuntu를 설치하는 일이 워낙 쉽다보니 딱히 설치기 같은 것을 언제부터인가 안 썼었다.
그리고 나는 정확히 말하면 Ubuntu가 아닌 Xubuntu 혹은 Mint MATE를 더 선호하는 사람이다. 간결하고 익숙하기 때문이다(결론은 나이들어서 변화가 귀찮다).

이번에 Xubuntu 14.04 LTS 가 출시되면서 회사 개발용 PC를 밀면서 Xubuntu로 갔는데, 설치 자체는 편했지만 몇가지 버그가 괴롭혔다. Ubuntu Unity버전에 비해 사용자가 적다보니 Xubuntu에 대한 버그 리포팅이나 해결책이 별로 안 나와있는 상황이라 삽질이 좀 있었다.

그래서 간략히 설치기의 링크를 걸고, 그 중 주의해야할 버그들을 공유한다.

Xubuntu 14.04 설치기 에서 기본적인 것은 읽어 보도록 하고,
부딪힌 버그와 해결책은 다음과 같다.

1. 지속적인 Apport 경고창 - 부팅시마다 알지도 못하는 경고창이 뜬다.
# 먼저 /var/crash 의 파일들을 삭제한다. 여기 있는 파일들이 부팅시 에러메시지로 나오는 것이다.
sudo rm /var/crash/*
sudo vi /etc/default/apport
# enabled=1 -> 0 으로변경

# apport restart 혹은 재부팅
sudo restart apport


2. 나눔 고딕 글꼴 상단 잘림 문제 -> https://github.com/igxactly/config-fonthinting-nanum

3. 한글 입력기 나비 Nabi 설치시 화면 왼쪽 위(좌상단) 클릭 안됨.
이 문제가 나를 가장 많이 골치아프게 한 것인데, 처음에는 무엇 때문인지도 몰랐다. 이상하게 화면 좌상단의 일부분이 전혀 클릭이 안되는 현상이 발생한다. 그렇다고 거기에 뭐가 있는것 같지도 않았는데....
제어판 -> 창관리자 기능향상 설정에서 합성(Composite) 기능을 끄면 갑자기 나비의 팔렛트가 해당 위치에 떡하니 나타난다. 이것이 클릭을 막고 있는데, 합성이 켜져 있을 경우 안보이는 것이었다.
팔렛트 숨기기를 아무리 해도 안 없어진다. 나비의 버그로 보인다. 결국 UIM으로 갈아탔다. iBus는 Shift-Space 사용시에 미묘한 타이밍 흐트러트림이 발생해서 싫어한다.
(이 현상 때문에 굳이 합성 기능을 꺼둘 필요는 없다)

4. XFCE 창관리자(XFWM)의 단축키 변경 안 되는 버그
리눅스에는 보통 두 종류의 키보다 단축키 조합이 있는데 하나는 창관리자(Window Manager)용으로 창(window)과 작업공간을 제어하는 단축키가 있고 일반 애플리케이션을 호출하는 단축키가 지정가능하다.
그런데 창관리자용 단축키를 변경했는데 적용이 안되는 현상이 발생했다.
이는 창관리자 단축키 설정시에 과거 설정과 신규 설정이 동시에 설정파일에 입력되면서 나타나는 버그이다. 결국 과거 설정을 설정 파일에서 지워줘야 한다.
~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml이게 설정파일인데 잘보면 동일한 역할에 대한 설정이 두 번씩 나오는 것을 볼 수 있다. 그 중에서 자기가 원치 않는 것을 삭제해버리고 XFCE를 재시작 하면 된다.

새로운 기능 - Xubuntu 14.04 new features
합성(Composite) 기능이 켜진 상태에서 Alt 키를 누른 상태로 마우스 휠을 움직이면 화면이 확대된다. 원래 안됐었나? 관심이 너무 없었네.


웬만하면 이번에는 6개월 후에도 계속 이 버전을 유지하면서 PPA로 주요 애플리케이션만 업그레이드 하는 전략을 취해 봐야겠다. 그게 안되면 이번에 LTS 기반으로 2년간 가기로 정한 Linux Mint MATE 로 가서 장기간 써야겠다.

공유하기 버튼

 
 

1 2 3 4 5 6 7 8 9 10 다음