Catch up with django

  - _do_update takes another argument
  - exceptions invalidate the whole atomic block they occur in, so we
    need to to wrap our failures with their own atomic block in the
    tests.