feat: add result transaction SQL boundary

This commit is contained in:
Josh Creek
2026-08-31 20:37:49 +01:00
parent a616b7637e
commit ecc78b7a2a
3 changed files with 69 additions and 1 deletions
+38
View File
@@ -0,0 +1,38 @@
package store
// ResultReceiptInsertSQL intentionally uses DO NOTHING. The adapter must
// select the existing receipt afterward and compare its digest; an identical
// retry is acknowledged, while a different payload is a conflict with no
// update side effect.
const ResultReceiptInsertSQL = `INSERT INTO result_receipts
(result_id, match_id, result_nonce, payload_digest, integrity_state, received_at)
VALUES ($1, $2, $3, $4, $5, $6)
ON CONFLICT DO NOTHING`
const ResultReceiptSelectSQL = `SELECT result_id, match_id, result_nonce, payload_digest,
integrity_state, received_at, committed_at
FROM result_receipts
WHERE match_id = $1
FOR UPDATE`
// ResultCommitLockSQL establishes the match lock before participant/rating
// locks. Rating rows are then locked in lexical player-ID order by the
// adapter, ensuring every concurrent result computes from one snapshot.
const ResultCommitLockSQL = `SELECT match_id, playlist, state
FROM matches
WHERE match_id = $1 AND server_id = $2
FOR UPDATE`
const ResultMatchCompleteSQL = `UPDATE matches
SET state = 'COMPLETED', revision = revision + 1, completed_at = $2
WHERE match_id = $1 AND state = 'RESULT_PENDING'`
const ResultOutboxSQL = `INSERT INTO outbox
(event_id, aggregate_type, aggregate_id, revision, event_type, payload)
VALUES ($1, 'match', $2, $3, 'match_completed', $4)`
const RatingLockSQL = `SELECT player_id, rating, deviation, volatility, ranked_games, revision
FROM ratings
WHERE player_id = ANY($1)
ORDER BY player_id
FOR UPDATE`
+30
View File
@@ -0,0 +1,30 @@
package store
import "testing"
func TestResultSQLPreservesReceiptConflictAndAtomicCommitBoundaries(t *testing.T) {
checks := map[string][]string{
ResultReceiptInsertSQL: {"ON CONFLICT DO NOTHING", "payload_digest", "integrity_state"},
ResultReceiptSelectSQL: {"FOR UPDATE", "committed_at"},
ResultCommitLockSQL: {"server_id = $2", "FOR UPDATE"},
ResultMatchCompleteSQL: {"state = 'RESULT_PENDING'", "revision = revision + 1"},
ResultOutboxSQL: {"match_completed", "aggregate_id", "revision"},
RatingLockSQL: {"ORDER BY player_id", "FOR UPDATE"},
}
for query, fragments := range checks {
for _, fragment := range fragments {
if !contains(query, fragment) {
t.Fatalf("query %q missing %q", query, fragment)
}
}
}
}
func contains(value, fragment string) bool {
for i := 0; i+len(fragment) <= len(value); i++ {
if value[i:i+len(fragment)] == fragment {
return true
}
}
return false
}