Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction: INSERT INTO
My guess is that you are using InnoDB and probably doing concurrent insertions.
To trace and understand the cause, check out these articles:
- MySQL deadlocks with concurrent inserts
- How can I configure MySQL Innodb to handle 1000s of inserts per hour?
One way to fix the issue is to retry like it is shown in the code below:
def add_products
retries = 0
begin
Product.add(self, "product_name", 10)
rescue ActiveRecord::StatementInvalid => ex
if ex.message =~ /Deadlock found when trying to get lock/ #ex not e!!
retries += 1
raise ex if retries > 3 ## max 3 retries
sleep 10
retry
else
raise ex
end
end
end
Or, there are some gems like transaction_retry to handle MySQL deadlocks.
This has saved me a lot of headaches: transaction_retry ruby gem.
From the README of the gem:
Retries database transaction on deadlock and transaction serialization errors. Supports MySQL, PostgreSQL, and SQLite.