Index: trac/versioncontrol/cache.py
===================================================================
--- trac/versioncontrol/cache.py	(revision 7921)
+++ trac/versioncontrol/cache.py	(working copy)
@@ -193,7 +193,6 @@
                         # also potentially in progress, so keep ''previous''
                         # notion of 'youngest'
                         self.repos.clear(youngest_rev=self.youngest)
-                        db.rollback()
                         return
 
                     # 1.2. now *only* one process was able to get there
@@ -226,6 +225,10 @@
                     if feedback:
                         feedback(self.youngest)
             finally:
+                # In case something went wrong, we need to be sure nothing 
+                # will be committed afterwards. In case we succeeded, no harm
+                # can be done by doing a rollback just after a commit.
+                db.rollback()
                 # 3. restore permission checking (after 1.)
                 self.repos.authz = authz
 

