Databases

Elixir Database Transactions

Handling Transactions

Elixir database transactions use Ecto.Multi for atomicity.

Introduction to Ecto.Multi

Ecto.Multi is a powerful feature in Elixir used to perform multiple database operations in a single transaction. It ensures that all operations within the transaction either complete successfully or none of them are applied, maintaining the atomicity of the transaction.

This is particularly useful in scenarios where a series of database actions need to be executed as a unit, such as creating a user profile and initializing account settings simultaneously.

Setting Up Ecto.Multi

To use Ecto.Multi, you need to have Ecto set up in your Elixir project. Ensure you have the necessary dependencies included in your mix.exs file:

Next, run mix deps.get to fetch the dependencies.

With Ecto and PostgreSQL set up, you can start using Ecto.Multi to manage your transactions.

Creating a Multi Transaction

To demonstrate how Ecto.Multi works, let's consider an example where you need to insert a new user and their associated profile in one atomic operation. Here's how you can achieve this using Ecto.Multi:

In this example, we create a new Ecto.Multi instance and chain multiple operations to it. The :create_user operation inserts a new user into the database. The :create_profile operation inserts a profile for that user, using the user ID generated by the first operation.

If the transaction is successful, the {:ok, changes} tuple is returned, containing the results of the operations. If any operation fails, the transaction is rolled back, and a {:error, failed_operation, failed_value, changes_so_far} tuple is returned.

Handling Rollbacks

Ecto.Multi handles rollbacks automatically if any of the operations fail. However, you might want to define specific actions to take when a rollback occurs. You can add a rollback function to your Multi like this:

In this adjusted example, if the transaction fails, the :custom_rollback operation is executed, allowing you to handle errors or clean up resources as needed.

Previous
Redis