You might come across situations where updating a shared state is unavoidable. You can use row-level locks if your database supports it or Django F() objects. Notably, MySQL using MyISAM engine does not have support for row-level locks.
Row-level locks are done in Django by calling select_for_update() on your QuerySet within a transaction. Consider this example:
with transaction.atomic(): feed = Feed.objects.select_for_update().get(id=id) feed.html = sanitize(feed.html) feed.save()
By using select_for_update, we lock the Feed object's row until the transaction is done. If another thread or process has already locked the same row, the query will be waiting or blocked until the lock is freed. This behavior ...