19644 set atomic transactions for Job Script run

This commit is contained in:
Arthur 2025-06-05 09:09:27 -07:00
parent 3cd0a930dc
commit caaed888f7

View File

@ -2,10 +2,11 @@ import logging
import traceback import traceback
from contextlib import ExitStack from contextlib import ExitStack
from django.db import transaction from django.db import router, transaction
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from core.signals import clear_events from core.signals import clear_events
from dcim.models import Device
from extras.models import Script as ScriptModel from extras.models import Script as ScriptModel
from netbox.jobs import JobRunner from netbox.jobs import JobRunner
from netbox.registry import registry from netbox.registry import registry
@ -39,7 +40,12 @@ class ScriptJob(JobRunner):
try: try:
try: try:
# A script can modify multiple models so need to do an atomic lock on
# both the default database (for non ChangeLogged models) and potentially
# any other database (for ChangeLogged models) - choosing Device as
# the model to use as it has ChangeLoggingMixin
with transaction.atomic(): with transaction.atomic():
with transaction.atomic(router.db_for_write(Device)):
script.output = script.run(data, commit) script.output = script.run(data, commit)
if not commit: if not commit:
raise AbortTransaction() raise AbortTransaction()