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 특성인듯)