diff --git a/patchwork/management/commands/parsemail.py b/patchwork/management/commands/parsemail.py
index bcb257f..2f90047 100644
--- a/patchwork/management/commands/parsemail.py
+++ b/patchwork/management/commands/parsemail.py
@@ -8,6 +8,7 @@ import logging
import sys
from django.core.management import base
+from django.db import transaction
from patchwork.parser import parse_mail
from patchwork.parser import DuplicateMailError
@@ -57,7 +58,8 @@ class Command(base.BaseCommand):
# broken email (ValueError): 1 (this could be noisy, if it's an issue
# we could use a different return code)
try:
- result = parse_mail(mail, options['list_id'])
+ with transaction.atomic():
+ result = parse_mail(mail, options['list_id'])
if result is None:
logger.warning('Nothing added to database')
except DuplicateMailError as exc:
diff --git a/releasenotes/notes/parsemail-transaction-d4e5f6g7h8i9j0k1.yaml b/releasenotes/notes/parsemail-transaction-d4e5f6g7h8i9j0k1.yaml
new file mode 100644
index 0000000..37ebb05
--- /dev/null
+++ b/releasenotes/notes/parsemail-transaction-d4e5f6g7h8i9j0k1.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+ - |
+ Wrap the entire parse_mail() function in a single database
+ transaction to prevent partial state from being visible to
+ concurrent readers.