Rewriting the usage of Shield.Intransaction (yes it's far from done and I'm already rewriting :) I think it makes generally more sense to not try to make every single method "atomic" by introducing a transaction. Instead we'll just generally assert a transaction in public methods in "shielded" classes, and the actual transactions will be started on just a few "global" places - generally there where we also handle exceptions. That way the transaction-ness doesn't get out of control and at the same time asserts make sure we have transactions where we need them.