Hi, Thanks Tres. I got to the bottom of what was happening. An attribute was being renamed "transparently" using the following code: def getConnection(self): if getattr(self, '_connection', None): self.db_connection = self._connection return self.db_connection Obviously, this fires every time getConnection is called, setting the attribute and therefore making the database commit. For reference, it should have been: def getConnection(self): if getattr(self, '_connection', None): self.db_connection = self._connection delattr(self, '_connection') return self.db_connection This only commits to the database once. Also out of interest, I found a handy way to find out what was going on, that I haven't come across previously, that might be of interest:
app._p_jar._registered_objects [] component.getConnection() app._p_jar._registered_objects [MyComponent.MyComponent] app._p_jat._registered_objects[0].__dict__ {....}
Basically I used it to work out which call caused the object to register with the transaction. In this case, there were only a couple of methods that got called, so it was more to verify it didn't get registered any more (the test case was "intermittent", i.e. only for the client :-/ ). Anyway, might be useful for someone, Cheers, Miles