Does this cause a race condition with MySQL (InnoDB):
Start Transaction.
Try to get record.
If record doesn\'t exist, return
Yes, it's possible for another transaction to check the table after you've read it.
Worse yet, because of how transactions work, even after you delete the row, any new transactions that start will see the row because you haven't yet committed the delete.
SELECT ... FOR UPDATE
is one way to prevent it.
LOCK TABLE tablename
is another.
Unfortunately, since you're using an ORM, I couldn't say whether it has the ability to do either of these.