refactor: 문서 개선 중

This commit is contained in:
donghyeon-ka
2026-09-21 14:30:55 +09:00
parent c93cdea150
commit 805a18f486
1497 changed files with 525837 additions and 59152 deletions
@@ -32,8 +32,8 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
4. 전이마다 상태 리비전을 올린다
소유권만으로는 부족하다. 자기가 본 시점까지 맞아야 한다.
5. 같은 가드를 쓰는 문장을 한 자리에 모은
흩어져 있으면 그중 하나가 조건을 짧게 쓰는 것을 막을다.
5. 같은 CAS 가드는 공통 SQL 생성 코드에서 만든
전이마다 WHERE 조건을 따로 작성하면 한 전이만 owner token이나 revision을 빠뜨릴다.
## 적용 조건
@@ -12,7 +12,7 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
# 시간은 DB에서, 그리고 행을 잠근 다음에 읽는다
애플리케이션 시계로 리스 만료를 판단하거나 잠그기 전의 시각으로 판단해, 서로 다른 노드가 같은 행에 대해 다른 답을 내는 것을 막는다. 시각은 데이터베이스에서 읽고, 행을 잠근 다음에 읽으며, 판정과 갱신을 한 문장 안에 둔다.
애플리케이션 시계로 리스 만료를 판단하거나 lock wait 이전의 시각으로 판단해 서로 다른 노드가 같은 행에 대해 다른 답을 내는 것을 막는다. 이 규칙에서는 행 lock을 획득한 뒤 PostgreSQL `clock_timestamp()`를 읽는다. transaction 시작 시각인 `now()`·`CURRENT_TIMESTAMP`·`transaction_timestamp()`는 lock wait 이후의 실제 시각을 반영하지 않으므로 이 용도의 대체재로 쓰지 않는다.
## 목적
@@ -20,11 +20,11 @@ verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지
## 규칙
1. 시각은 데이터베이스에서 읽는다
여러 노드의 시계는 서로 다르다. 리스 만료 판정의 기준 시각이 노드마다 다르면 두 노드가 동시에 소유자가 될 수 있다.
1. 행 lock 뒤 `clock_timestamp()` 읽는다
여러 노드의 애플리케이션 시계 대신 DB 시계를 쓰고, lock wait가 끝난 뒤 호출 시점의 실제 시각을 읽는다. `now()``CURRENT_TIMESTAMP`는 transaction start time이라 이 용도에는 맞지 않는다.
2. 행을 잠근 다음에 읽는다
그기 전의 시각으로 판단하면 잠금을 기다리는 동안 리스가 만료될 수 있다.
2. lock 이전에 읽은 시각을 재사용하지 않는다
잠금을 기다리는 동안 lease가 만료될 수 있으므로 판정에 쓰는 시각은 lock 획득 후 다시 얻는다.
3. 판정과 갱신을 한 문장 안에 둔다
시각 비교를 where 절에 넣으면 판정과 갱신 사이에 시간이 흐르지 않는다.