1
0
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:
Aymeric Augustin
2013-03-04 15:57:04 +01:00
parent e264f67174
commit 4b31a6a9e6
4 changed files with 40 additions and 12 deletions

View File

@@ -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: