#24921: No Database objects can be created with set_autocommit(False)
-------------------------------------+-------------------------------------
     Reporter:  shabda               |                    Owner:  shabda
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  1.8
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:  Accepted
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------

Comment (by aaugustin):

 `Atomic` is a context-manager / decorator in order to enforce proper
 matching between `__enter__` and `__exit__` calls. If the calls aren't
 balanced properly, data loss will happen, and it may be hard to diagnose.
 That's why I've historically rejected the idea of exposing this methods
 through public APIs.

 Django uses the hack carljm suggests in its own test setUp / tearDown
 functions. See `TestCase._enter_atomics` and `_rollback_atomics`. That's
 exactly the OP's use case, so I suggest using that as a stop gap solution.
 Don't forget to call `set_rollback(True)` before exiting, since you want a
 rollback.

 For the ORM to function with autocommit off, we should change the
 `savepoint` parameter of `atomic` to add a third-value, `None` (three-
 valued booleans, grrr), which would mean "automatic" and be implemented as
 follows:

     if self.savepoint is None:
         self.savepoint = not connection.in_atomic_block and not
 connection.get_autocommit()

 In other words, it would mean "no savepoint, unless I'm the outermost
 atomic block in a connection that is already in a transaction, which means
 I can't use a plain transaction"

 That's backwards incompatible. It just makes Django cope with a situation
 where it would previously rais `TransactionManagementError`.

--
Ticket URL: <https://code.djangoproject.com/ticket/24921#comment:10>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/064.5d3bef88eef685f809f7c2cc75d73796%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to