mathieuprog
`retry_on_stale/2` - retry operations encountering Ecto's stale entry errors
Elixir utility for retrying operations encountering Ecto’s stale entry errors (Ecto.StaleEntryError).
A more lightweight version of the retry library specifically designed to handle stale entry errors when using optimistic locking, requiring subsequent attempts.
import RetryOnStale, only: [retry_on_stale: 2]
def increase_wallet_balance(%Wallet{} = wallet, amount) do
retry_on_stale(
fn attempt ->
# refetch the latest wallet data for subsequent attempts
wallet = if attempt == 1, do: wallet, else: Repo.get!(Wallet, wallet.id)
# this function could raise a StaleEntryError
do_increase_wallet_balance(wallet, amount)
end,
max_attempts: 5, delay_ms: 100
)
end
defp do_increase_wallet_balance(%Wallet{} = wallet, amount) do
new_balance = Decimal.add(wallet.balance_amount, amount)
wallet
|> Ecto.Changeset.change(balance_amount: new_balance)
|> Ecto.Changeset.optimistic_lock(:lock_version)
|> Repo.update!()
end
GitHub repo:
Most Liked
mayel
You probably know this, but for others reading, you can also let the DB take care of the increment/decrement:
def increase_wallet_balance(wallet_id, by_amount) do
from(w in Wallet,
update: [inc: [balance_amount: ^by_amount]],
where: w.id == ^wallet_id
)
|> Repo.update_all([])
end
def decrease_wallet_balance(wallet_id, by_amount) do
increase_wallet_balance(wallet_id, -by_amount)
end
2
Popular in Libraries
I feel kind of stuck with the absence of a proper xml library for Elixir. Currently I use SweetXML which was ok for me more or less to pa...
New
Hello there,
I would like to share a feature toggles library (AKA feature flags) I’ve been working on.
The main package is FunWithFlags...
New
Dear Elixir community,
After a year of development, bug fixes, and improvements, we are proudly ready to share the release of Crawly 0.1...
New
I’d like to announce a small library called boundaries.
This is an experimental project which explores the idea of enforcing boundaries ...
New
I created a new library GitHub - benvp/ex_cva: Class Variance Authority for Elixir which aims to make it very easy to define different va...
New
I’ve published the first version of my Makeup library. It’s a syntax highlighter for Elixir in the spirit of Pygments, Currently it highl...
New
I have been updating a library that allows you to pipe between functions that use the erlang result tuple convention.
Assuming you have...
New
Hello everyone,
I wrote a small library today called MapDiff.
It returns a map listing the (smallest amount of) changes to get from map...
New
EctoJob
A transactional job queue built with Ecto, PostgreSQL and GenStage
Available on Hex.pm: ecto_job | Hex
Docs: API Reference — ec...
New
Hey everyone
i’ve developed a library for Jalaali calendar for elixir which supports converting Gregorian dates to Jalaali and vice vers...
New
Other popular topics
Here are few pieces of (common) Linux knowledge that we use for reasonably small one server apps. We use Ubuntu but this should work for ...
New
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Hi,
I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
Hi guys, i’m new in the Elixir world, and i have to say, that i love it!
i’m having some problem to understand anonymous functions with ...
New
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: )
Hello all, this is ...
New
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
by Lance Halvorsen
Elixir and Phoenix are generating tremendous excitement as an unbeatable platform for building modern web application...
New







