diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py
--- a/django/db/backends/mysql/base.py
+++ b/django/db/backends/mysql/base.py
@@ -263,6 +263,15 @@
     def max_name_length(self):
         return 64
 
+    def savepoint_create_sql(self, sid):
+        return "SAVEPOINT %s" % sid
+
+    def savepoint_commit_sql(self, sid):
+        return "RELEASE SAVEPOINT %s" % sid
+
+    def savepoint_rollback_sql(self, sid):
+        return "ROLLBACK TO SAVEPOINT %s" % sid
+
 class DatabaseWrapper(BaseDatabaseWrapper):
     vendor = 'mysql'
     operators = {
@@ -330,6 +339,8 @@
             self.connection = Database.connect(**kwargs)
             self.connection.encoders[SafeUnicode] = self.connection.encoders[unicode]
             self.connection.encoders[SafeString] = self.connection.encoders[str]
+            self.features.uses_savepoints = \
+                self.get_server_version() >= (5, 0, 3)
             connection_created.send(sender=self.__class__, connection=self)
         cursor = CursorWrapper(self.connection.cursor())
         return cursor
diff --git a/docs/releases/1.4.txt b/docs/releases/1.4.txt
--- a/docs/releases/1.4.txt
+++ b/docs/releases/1.4.txt
@@ -238,6 +238,9 @@
 * It is now possible to load fixtures containing forward references when using
   MySQL with the InnoDB database engine.
 
+* The MySQL database backend supports taking advantage of savepoint as featured
+  by MySQL version 5.0.3 or newer with the InnoDB storage engine.
+
 .. _backwards-incompatible-changes-1.4:
 
 Backwards incompatible changes in 1.4
diff --git a/docs/topics/db/transactions.txt b/docs/topics/db/transactions.txt
--- a/docs/topics/db/transactions.txt
+++ b/docs/topics/db/transactions.txt
@@ -227,9 +227,13 @@
 
 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 to the PostgreSQL 8 and Oracle backends. Other backends will
-provide the savepoint functions, but they are empty operations - they won't
-actually do anything.
+available to the PostgreSQL 8, Oracle and MySQL (version 5.0.3 and newer, when
+using the InnoDB storage bckend) backends. Other backends will provide the
+savepoint functions, but they are empty operations - they won't actually do
+anything.
+
+.. versionchanged:: 1.4
+   Savepoint support when using the MySQL backend was added in Django 1.4
 
 Savepoints aren't especially useful if you are using the default
 ``autocommit`` behavior of Django. However, if you are using
diff --git a/tests/regressiontests/transactions_regress/tests.py b/tests/regressiontests/transactions_regress/tests.py
--- a/tests/regressiontests/transactions_regress/tests.py
+++ b/tests/regressiontests/transactions_regress/tests.py
@@ -162,3 +162,36 @@
             _ = User.objects.all()[0]
         except:
             self.fail("A transaction consisting of a failed operation was not closed.")
+
+
+class SavepointTest(TransactionTestCase):
+
+    @skipUnlessDBFeature('uses_savepoints')
+    def test_savepoint_commit(self):
+        @commit_manually
+        def work():
+            mod = Mod.objects.create(fld=1)
+            pk = mod.pk
+            sid = transaction.savepoint()
+            mod1 = Mod.objects.filter(pk=pk).update(fld=10)
+            transaction.savepoint_commit(sid)
+            mod2 = Mod.objects.get(pk=pk)
+            transaction.commit()
+            self.assertEqual(mod2.fld, 10)
+
+        work()
+
+    @skipUnlessDBFeature('uses_savepoints')
+    def test_savepoint_rollback(self):
+        @commit_manually
+        def work():
+            mod = Mod.objects.create(fld=1)
+            pk = mod.pk
+            sid = transaction.savepoint()
+            mod1 = Mod.objects.filter(pk=pk).update(fld=20)
+            transaction.savepoint_rollback(sid)
+            mod2 = Mod.objects.get(pk=pk)
+            transaction.commit()
+            self.assertEqual(mod2.fld, 1)
+
+        work()
