Transactions

Transactions ensure multiple database operations succeed or fail together, maintaining data consistency.

Basic Transactions

AppDB.transaction do
  user = User.create!(name: "Alice", email: "alice@example.com")
  profile = UserProfile.create!(user_id: user.id, bio: "Hello!")
  # Both records saved, or neither is saved
end

Automatic Rollback

If an exception is raised inside a transaction, all changes are rolled back:

AppDB.transaction do
  User.create!(name: "Alice", email: "alice@example.com")
  raise "Something went wrong!"
  # User is NOT saved - transaction rolled back
end

Manual Rollback

Explicitly rollback a transaction:

Nested Transactions (Savepoints)

Nest transactions using savepoints for partial rollback:

Transaction Return Values

Transactions return the value of the last expression:

Using with Azu Endpoints

Multi-Model Operations

Transaction Isolation

Configure isolation level for specific requirements:

Error Handling Patterns

Retry on Conflict

Conditional Commit

Best Practices

  1. Keep transactions short: Long transactions hold locks and reduce concurrency

  2. Avoid external calls: Don't make HTTP requests inside transactions

  3. Handle exceptions: Always rescue and handle transaction failures gracefully

  4. Use savepoints sparingly: They add overhead; prefer flat transactions when possible

  5. Test rollback behavior: Ensure your application handles rollbacks correctly

Next Steps

  • Models - CRUD operations within transactions

  • Queries - Query data within transaction scope

Last updated

Was this helpful?