Transactions were a bit of a problem, but fixed in quite an elegant way
(I think). We nest transactions on each of the CRUD operations
(currently apart from Read), so that every CUD operation creates a
transaction, and if they are nested that's fine. 

In order to make this work I found some updates that were happening
outside an explicit transaction so extended UpdateOperation to wrap
these changes (which is where they should have been anyway)