• Florian Apolloner's avatar
    Fixed #21171 -- Avoided starting a transaction when a single (or atomic queries) are executed. · bc7dd849
    Florian Apolloner yazdı
    Checked the following locations:
    
     * Model.save(): If there are parents involved, take the safe way and use
       transactions since this should be an all or nothing operation.
    
       If the model has no parents:
    
        * Signals are executed before and after the previous existing
          transaction -- they were never been part of the transaction.
    
        * if `force_insert` is set then only one query is executed -> atomic
          by definition and no transaction needed.
    
        * same applies to `force_update`.
    
        * If a primary key is set and no `force_*` is set Django will try an
          UPDATE and if that returns zero rows it tries an INSERT. The first
          case is completly save (single query). In the second case a
          transaction should not produce different results since the update
          query is basically a no-op then (might miss something though).
    
     * QuerySet.update(): no signals issued, single query -> no transaction
       needed.
    
     * Model/Collector.delete(): This one is fun due to the fact that is
       does many things at once.
    
       Most importantly though: It does send signals as part of the
       transaction, so for maximum backwards compatibility we need to be
       conservative.
    
       To ensure maximum compatibility the transaction here is removed only
       if the following holds true:
    
         * A single instance is being deleted.
         * There are no signal handlers attached to that instance.
         * There are no deletions/updates to cascade.
         * There are no parents which also need deletion.
    bc7dd849
Adı
Son kayıt (commit)
Son güncelleme
..
__init__.py Loading commit data...
models.py Loading commit data...
tests.py Loading commit data...