반응형

 일단 당연히 트랜잭션의 무결성을 유지하도록 설계가 되어야한다.

이러기 위해서는 원자성, 일관성, 고립성, 지속성이 유지가 되어야한다.

 

1) 원자성이 보장되기 위해, atomic을 수행한다.

기본적으로 장고는 auto_commit이다.

이에 따라 해당 계좌에 가서,  잔액을 바꾸고, 거래내역을 등록하는 이 2가지 행위가 각각 이루어질 우려가 있으므로,

with transaction.atomic()을 넣어줘야 한다.

 

참고:

https://brownbears.tistory.com/573

https://docs.djangoproject.com/en/4.0/topics/db/transactions/

 

 

2) 일관성 같은 경우는 테이블이 생성될 때  명시되므로, 크게 신경 쓸 필요없다.

 

3) 고립성을 보장하기 위해, 동시성 제어를 한다.(concurrency control)

-은행이니 만큼, 최고수준의 격리를 하여서 안정성을 확보해야한다.

-main db 와 replication db로 나누어서, write, update는 main에서만 하고, read는 replication db 에서만 가능하게 한다.

-쓰기와 관련된 충돌은 select_for_update()를 통해서 방지한다.

-읽기/읽기와 관련된 충돌은 고립수준을 serializable 모드로 하여서 방지한다.

 

 

**TMI:

main -replica db로 나뉘어져 있는 상황에도 isolation을 신경써야할까?

- 그렇다. 왜냐하면 main db가 다운되면 replica가 maindb가되기 때문이다.

 

 

4.  지속성 역시 aws에서 로그기록을 남기도록 설정하였다.

추가적으로 aws-rds에서 multi-az를 활성화하였다. 

이를 통해 혹시나 생길 db instance 중단에 standby replica로 대체하도록 하였다.

 

https://support.bespinglobal.com/support/solutions/articles/16000038897--aws-rds-multi-az-

 

반응형

+ Recent posts