DB

PPAS (PostgreSQL) 에서 트랜젝션 유의사항

김모작자 2016. 9. 30. 13:47

PPAS (PostgreSQL Advanced Server)에서

select - update 또는 select - delete 하는 경우 아래와 같이 트랜젝션이 겹칠 수 있다



보통 MySQL 등에선 Isolation Level 을 Serializable 로 설정 후 Select 한 대상을 Update 해서

우의 상황을 해결하는데

PPAS 에서 위와 같이 Transaction 을 처리하는 경우

could not serialize access due to concurrent update

예외가 발생할 수 있다.

 

보통 MySQL 등에서는 Serializable 상태에서 Select 하면 해당 테이블에 잠금이 생기지만

PPAS 에서는 Update 하면서 잠기기 때문인데,

1) Update 한게 다른 쓰레드(진입)에서 Select 에서 blocking 되지 않고

2) Update 된 걸 다시 Update 한 꼴이 되면서

3) 에러가 발생된다

 

PPAS 에서는 그래서

--> Isolation 설정 없이, Select ~ for update 로 데이터 추출 후, Update 를 하면 된다

--> 단 서비스의 @Transactional 이 붙은 함수 내에서 모든 처리가 끝나야 한다.

--> 단일 트랜젝션간에만 update 잠금이 발생하기 때문

 

 

추가로

PPAS 에서도 Select 에 Limit 을 사용할 수 있는데

Select * from src limit 1;

위의 경우 MySQL 에서는 src 의 clustered index, 특정 index 에 의해 일관된 순서대로 추출되지만

PPAS 에서는 order by 없이 limit 사용시 임의의 순서대로 추출된다

==> 일관된 순서가 필요시 order by 를 추가해서 사용하도록 한다

==>  order by 없을 시 랜덤하게 나오는건 버그라 아니라고 PPAS 문서에 명시돼 있음 (PPAS 뿐만 아니라 PostgreSQL 특성인듯)