diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py index 991a064cee..f8c0ddea00 100644 --- a/django/db/backends/mysql/features.py +++ b/django/db/backends/mysql/features.py @@ -78,3 +78,10 @@ class DatabaseFeatures(BaseDatabaseFeatures): cursor.execute('SELECT @@SQL_AUTO_IS_NULL') result = cursor.fetchone() return result and result[0] == 1 + + @cached_property + def supports_transactions(self): + """ + All storage engines except MyISAM support transactions. + """ + return self._mysql_storage_engine != 'MyISAM' diff --git a/tests/backends/test_features.py b/tests/backends/test_features.py index 831a0002a3..e7cb3dbfe8 100644 --- a/tests/backends/test_features.py +++ b/tests/backends/test_features.py @@ -1,8 +1,25 @@ +from unittest import skipUnless + from django.db import connection -from django.test import TestCase +from django.test import TestCase, mock class TestDatabaseFeatures(TestCase): def test_nonexistent_feature(self): self.assertFalse(hasattr(connection.features, 'nonexistent')) + + +@skipUnless(connection.vendor == 'mysql', 'MySQL backend tests') +class TestMySQLFeatures(TestCase): + + def test_mysql_supports_transactions(self): + """ + All storage engines except MyISAM support transactions. + """ + with mock.patch('django.db.connection.features._mysql_storage_engine', 'InnoDB'): + self.assertTrue(connection.features.supports_transactions) + del connection.features.supports_transactions + with mock.patch('django.db.connection.features._mysql_storage_engine', 'MyISAM'): + self.assertFalse(connection.features.supports_transactions) + del connection.features.supports_transactions