mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
Added support for savepoints in SQLite.
Technically speaking they aren't usable yet.
This commit is contained in:
@@ -251,11 +251,11 @@ the transaction middleware, and only modify selected functions as needed.
|
||||
Savepoints
|
||||
==========
|
||||
|
||||
A savepoint is a marker within a transaction that enables you to roll back part
|
||||
of a transaction, rather than the full transaction. Savepoints are available
|
||||
with the PostgreSQL 8, Oracle and MySQL (when using the InnoDB storage engine)
|
||||
backends. Other backends provide the savepoint functions, but they're empty
|
||||
operations -- they don't actually do anything.
|
||||
A savepoint is a marker within a transaction that enables you to roll back
|
||||
part of a transaction, rather than the full transaction. Savepoints are
|
||||
available with the SQLite (≥ 3.6.8), PostgreSQL, Oracle and MySQL (when using
|
||||
the InnoDB storage engine) backends. Other backends provide the savepoint
|
||||
functions, but they're empty operations -- they don't actually do anything.
|
||||
|
||||
Savepoints aren't especially useful if you are using the default
|
||||
``autocommit`` behavior of Django. However, if you are using
|
||||
@@ -314,6 +314,21 @@ The following example demonstrates the use of savepoints::
|
||||
Database-specific notes
|
||||
=======================
|
||||
|
||||
Savepoints in SQLite
|
||||
--------------------
|
||||
|
||||
While SQLite ≥ 3.6.8 supports savepoints, a flaw in the design of the
|
||||
:mod:`sqlite3` makes them hardly usable.
|
||||
|
||||
When autocommit is enabled, savepoints don't make sense. When it's disabled,
|
||||
:mod:`sqlite3` commits implicitly before savepoint-related statement. (It
|
||||
commits before any statement other than ``SELECT``, ``INSERT``, ``UPDATE``,
|
||||
``DELETE`` and ``REPLACE``.)
|
||||
|
||||
As a consequence, savepoints are only usable if you start a transaction
|
||||
manually while in autocommit mode, and Django doesn't provide an API to
|
||||
achieve that.
|
||||
|
||||
Transactions in MySQL
|
||||
---------------------
|
||||
|
||||
@@ -363,11 +378,11 @@ itself.
|
||||
Savepoint rollback
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you are using PostgreSQL 8 or later, you can use :ref:`savepoints
|
||||
<topics-db-transactions-savepoints>` to control the extent of a rollback.
|
||||
Before performing a database operation that could fail, you can set or update
|
||||
the savepoint; that way, if the operation fails, you can roll back the single
|
||||
offending operation, rather than the entire transaction. For example::
|
||||
You can use :ref:`savepoints <topics-db-transactions-savepoints>` to control
|
||||
the extent of a rollback. Before performing a database operation that could
|
||||
fail, you can set or update the savepoint; that way, if the operation fails,
|
||||
you can roll back the single offending operation, rather than the entire
|
||||
transaction. For example::
|
||||
|
||||
a.save() # Succeeds, and never undone by savepoint rollback
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user