#!/bin/bash
# Simulasi dua terminal: terminal A mengunci baris, terminal B menolak mengantre.
# Skrip menjalankan dua sesi psql terpisah, lalu mencetak keluaran masing-masing.

: "${PGDATABASE:=latihan}"
export PGDATABASE

TMPD=$(mktemp -d)
mkfifo "$TMPD/komando.fifo"

# Terminal A: sesi psql yang tetap hidup, perintah dikirim lewat fifo
PGAPPNAME=terminal-a psql -X < "$TMPD/komando.fifo" > "$TMPD/a.log" 2>&1 &
SESIA=$!
exec 3>"$TMPD/komando.fifo"

printf 'BEGIN;\nSELECT saldo FROM rekening WHERE id = 1 FOR UPDATE;\n' >&3

# Tunggu sampai transaksi A benar-benar memegang kunci (status idle in transaction)
for i in $(seq 1 100); do
  n=$(psql -X -tA -c "SELECT count(*) FROM pg_stat_activity
                      WHERE datname = current_database()
                        AND application_name = 'terminal-a'
                        AND state = 'idle in transaction'")
  [ "$n" = "1" ] && break
  sleep 0.05
done

# Terminal B: minta baris yang sama tanpa mau mengantre
PGAPPNAME=terminal-b psql -X -c "SELECT saldo FROM rekening WHERE id = 1 FOR UPDATE NOWAIT;" \
  > "$TMPD/b.log" 2>&1

# Terminal A menutup transaksinya
printf 'COMMIT;\n' >&3
exec 3>&-
wait $SESIA

echo "== Terminal A: kunci dipegang, transaksi masih terbuka =="
cat "$TMPD/a.log"
echo
echo "== Terminal B: NOWAIT langsung ditolak =="
cat "$TMPD/b.log"

rm -rf "$TMPD"
