transaction-consistency-designer

von kotlin

Entwerfen Sie sichere Transaktionsgrenzen, Rollback-Verhalten, Idempotenz, Sperr- und Konsistenzstrategien für Kotlin- und Spring-Geschäftsworkflows. Verwenden Sie dies, wenn ein…

npx skills add https://github.com/kotlin/kotlin-backend-agent-skills --skill transaction-consistency-designer

Transaction Consistency Designer

Source mapping: Tier 1 critical skill derived from Kotlin_Spring_Developer_Pipeline.md (SK-09).

Mission

Place transaction boundaries where business invariants are actually enforced, not where annotations are easiest to type. Prevent data loss, duplicate side effects, and hidden consistency bugs.

Gather These Inputs

  • The business workflow step by step.
  • The repositories and tables touched by each step.
  • Current @Transactional annotations, propagation, isolation, and exception handling.
  • Any external HTTP, message broker, scheduler, or file I/O inside the workflow.
  • Idempotency, retry, and concurrency requirements.

Model The Workflow Explicitly

  • Break the use case into state-changing steps and side effects.
  • Mark which steps must be atomic together and which can be asynchronous.
  • Mark where external systems are called.
  • Mark where retries may happen.
  • Mark the business invariant that must not be violated.

Decision Rules

  • Keep one database transaction focused on one consistency boundary.
  • Avoid holding a database transaction open across external network calls.
  • Prefer idempotency keys plus unique constraints for duplicate-request safety.
  • Prefer the outbox pattern or post-commit publication for messages that must reflect committed state.
  • Choose locking strategy based on contention and correctness needs:
    • optimistic locking for low-contention update races
    • unique constraints for duplicate prevention
    • pessimistic locking only when contention and correctness justify it

Spring-Specific Checks

  • Verify whether @Transactional is on a proxied public entry point.
  • Verify whether self-invocation bypasses the transaction boundary.
  • Verify rollback rules. By default, unchecked exceptions roll back, checked exceptions may not.
  • Verify whether readOnly = true is used only where appropriate.
  • Verify whether REQUIRES_NEW is truly required or is masking a design issue.
  • Treat NESTED as database- and platform-dependent, not a universal escape hatch.

Anti-Patterns To Flag

  • @Transactional on controllers by default.
  • One transaction that does database writes and then performs slow HTTP calls.
  • Catching exceptions inside the transaction and converting them to success-like flows.
  • Publishing irreversible side effects before commit.
  • Assuming retries are safe without idempotency.
  • Using a bigger propagation setting to hide unclear boundaries.

Advanced Consistency Nuances

  • Distinguish duplicate prevention from concurrency control. A unique constraint solves one class of race, not lost updates or write skew.
  • Remember that many integrity failures surface on flush or commit, not at the line that changed the entity. Design tests and exception handling accordingly.
  • UnexpectedRollbackException often means an inner operation marked the transaction rollback-only even though the outer layer tried to return success.
  • Isolation levels are database-specific in effect. The same setting on Postgres, MySQL, and SQL Server may protect different anomalies.
  • Deadlock and serialization-failure retries belong at a carefully chosen outer boundary. Retrying a half-executed workflow with external side effects is dangerous.
  • @TransactionalEventListener and TransactionSynchronization are phase-sensitive. Choose before-commit, after-commit, or after-rollback behavior deliberately.
  • If the workflow crosses service boundaries, distinguish local transaction design from saga or orchestration design. Do not pretend one local transaction can guarantee distributed consistency.
  • In reactive or coroutine transaction flows, verify which transaction manager and context propagation model is actually in use. Imperative assumptions often fail there.

Expert Heuristics

  • Start from the invariant, not from the annotation. Ask what must never be observably false to users or downstream systems.
  • Prefer database-enforced invariants for uniqueness and impossible states, then use application logic to make violations rare and understandable.
  • If a workflow mixes command and query steps, decide whether read-your-write guarantees are required immediately or whether eventual consistency is acceptable.
  • If the team wants REQUIRES_NEW, ask whether they are isolating audit logging, masking rollback behavior, or compensating for a larger design problem.

Output Contract

Return these sections:

  • Consistency goal: the business invariant being protected.
  • Recommended boundary: where the main transaction starts and ends.
  • Propagation and isolation: only the settings that matter and why.
  • Idempotency and concurrency: duplicate handling, locking, and retry safety.
  • External side effects: what must happen outside the transaction or through outbox-style patterns.
  • Verification: tests or scenarios that prove rollback, duplicate handling, and conflict behavior.

Guardrails

  • Do not put @Transactional on every service method by default.
  • Do not recommend distributed 2PC or XA unless the project already uses it and truly requires it.
  • Do not ignore the cost of holding database connections during external calls.
  • Do not treat duplicate prevention as an application-only concern when the database can enforce it.

Quality Bar

A good run of this skill turns a vague workflow into explicit consistency boundaries and testable invariants. A bad run decorates methods with @Transactional without modeling failure paths, retries, and side effects.

Mehr Skills von kotlin

kotlin-backend-jpa-entity-mapping
kotlin
Kotlins Data Class ist natürlich für DTOs, aber gefährlich für JPA-Entitäten. Hibernate ist auf Identitätssemantik angewiesen, die Data Class bricht: equals / hashCode über alle Felder korrumpiert die Set-/Map-Zugehörigkeit nach Zustandsänderungen, und automatisch generiertes copy() erzeugt getrennte Duplikate von verwalteten Entitäten.
kotlin-tooling-agp9-migration
kotlin
Das Android Gradle Plugin 9.0 macht die Android-App- und Bibliotheks-Plugins inkompatibel mit dem Kotlin Multiplatform-Plugin im selben Modul. Diese Fähigkeit führt Sie durch die Migration.
kotlin-tooling-cocoapods-spm-migration
kotlin
Migriere KMP-Projekte von CocoaPods (kotlin("native.cocoapods")) zu Swift Package Manager (swiftPMDependencies DSL) – ersetzt pod() durch swiftPackage(),…
kotlin-tooling-immutable-collections-0-5-x-migration
kotlin
Migriere Kotlin- (und Java-) Code von kotlinx.collections.immutable 0.3.x / 0.4.x auf die neueste 0.5.x. Die 0.5.x-Reihe benennt jede kopierrückgebende Methode auf … um.
kotlin-tooling-java-to-kotlin
kotlin
Konvertieren Sie Java-Quelldateien in idiomatisches Kotlin unter Verwendung einer disziplinierten 4-Schritte-Konvertierungsmethodik mit 5 Invarianten, die bei jedem Schritt überprüft werden. Unterstützt framework-bewusste Konvertierung, die Annotationsziele, Bibliotheksidiome und API-Erhaltung behandelt.
kotlin-tooling-native-build-performance
kotlin
Diagnostiziert und behebt langsame Kotlin/Native-Kompilierung und -Verknüpfung in Kotlin-Multiplatform-Projekten, die auf iOS abzielen. Verwenden Sie, wenn der Benutzer langsame iOS- oder…
kotlin-spring-proxy-compatibility
kotlin
Diagnose and prevent Kotlin plus Spring proxy failures around `@Transactional`, `@Cacheable`, `@Async`, method security, retry, configuration proxies, and JPA…
ci-cd-containerization-advisor
kotlin
Entwerfen Sie reproduzierbare Build-, Image- und Deployment-Pipelines für Kotlin plus Spring-Anwendungen, einschließlich CI-Verifikation, geschichteten Containern, Rollout-Sicherheit,…