diff --git a/assembly.py b/assembly.py
index 3432c75..d5b6e6e 100644
--- a/assembly.py
+++ b/assembly.py
@@ -2310,6 +2310,7 @@ BuildShapeNames = (BuildShapeNone,BuildShapeCompound,
 
 class Assembly(AsmGroup):
     _Timer = QtCore.QTimer()
+    _TransID = 0
     _PartMap = {} # maps part to assembly
     _PartArrayMap = {} # maps array part to assembly
     _ScheduleTimer = QtCore.QTimer()
@@ -2420,6 +2421,7 @@ class Assembly(AsmGroup):
             if not cls._Timer.isSingleShot():
                 cls._Timer.setSingleShot(True)
                 cls._Timer.timeout.connect(Assembly.onSolverTimer)
+            cls._TransID = FreeCAD.getActiveTransaction()
             logger.debug('auto solve scheduled on change of {}.{}'.format(
                 objName(obj),prop),frame=1)
             cls._Timer.start(300)
@@ -2434,12 +2436,17 @@ class Assembly(AsmGroup):
         if not cls.canAutoSolve():
             return
         from . import solver
-        FreeCAD.setActiveTransaction('Assembly auto recompute')
+        trans = cls._TransID and cls._TransID==FreeCAD.getActiveTransaction()
+        if not trans:
+            cls._TransID = 0
+            FreeCAD.setActiveTransaction('Assembly auto recompute')
         if not logger.catch('solver exception when auto recompute',
                 solver.solve, FreeCAD.ActiveDocument.Objects, True):
-            FreeCAD.closeActiveTransaction(True)
+            if not trans:
+                FreeCAD.closeActiveTransaction(True)
         else:
-            FreeCAD.closeActiveTransaction()
+            if not trans:
+                FreeCAD.closeActiveTransaction()
 
     @classmethod
     def scheduleDelete(cls,doc,names):
diff --git a/slvs b/slvs
index 5794991..8b66606 160000
--- a/slvs
+++ b/slvs
@@ -1 +1 @@
-Subproject commit 5794991d662c8b4321b20ac7fd289cfe06f3ad42
+Subproject commit 8b66606ef0d30e3dc9038fa79bc8f1d46f96fed5