#!/usr/bin/env bash # Does the inner write survive when the outer transaction fails? And what happens when the # caller catches the inner exception? set -euo pipefail set +m cd "$(dirname "$0")/.." source scripts/env.sh { echo "== rollback behaviour ==" echo start_app > /dev/null curl -s "http://127.0.0.1:${APP_PORT}/tx/rollback" | python3 -c ' import json,sys for k,v in json.load(sys.stdin).items(): print(" %s" % k) print(" outcome : %s" % v["outcome"]) if "message" in v: print(" message : %s" % v["message"]) print(" rows : %s -> %s" % (v["auditRowsSurviving"], v["verdict"])) print()' echo "The third and fourth rows are the ones worth sitting with." echo echo "When a REQUIRED inner scope throws, it marks the SHARED transaction rollback-only" echo "before the exception leaves it. The caller can catch the exception -- and does, and" echo "returns normally -- but the transaction is already doomed, so the commit at the end" echo "throws UnexpectedRollbackException. Catching the exception did not save the work; it" echo "only moved the failure to a place with no useful stack trace." echo echo "With REQUIRES_NEW the inner scope had its own physical transaction, so its rollback" echo "is contained and the caller's catch behaves the way the code reads." stop_app } > docs/output/02-rollback.txt 2>&1 cat docs/output/02-rollback.txt