@@ -1192,6 +1192,18 @@ def connections_support_transactions(aliases=None):
1192
1192
return all (conn .features .supports_transactions for conn in conns )
1193
1193
1194
1194
1195
+ def connections_support_savepoints (aliases = None ):
1196
+ """
1197
+ Return whether or not all (or specified) connections support savepoints.
1198
+ """
1199
+ conns = (
1200
+ connections .all ()
1201
+ if aliases is None
1202
+ else (connections [alias ] for alias in aliases )
1203
+ )
1204
+ return all (conn .features .uses_savepoints for conn in conns )
1205
+
1206
+
1195
1207
class TestData :
1196
1208
"""
1197
1209
Descriptor to provide TestCase instance isolation for attributes assigned
@@ -1266,10 +1278,17 @@ def _rollback_atomics(cls, atomics):
1266
1278
def _databases_support_transactions (cls ):
1267
1279
return connections_support_transactions (cls .databases )
1268
1280
1281
+ @classmethod
1282
+ def _databases_support_savepoints (cls ):
1283
+ return connections_support_savepoints (cls .databases )
1284
+
1269
1285
@classmethod
1270
1286
def setUpClass (cls ):
1271
1287
super ().setUpClass ()
1272
- if not cls ._databases_support_transactions ():
1288
+ if not (
1289
+ cls ._databases_support_transactions ()
1290
+ and cls ._databases_support_savepoints ()
1291
+ ):
1273
1292
return
1274
1293
cls .cls_atomics = cls ._enter_atomics ()
1275
1294
@@ -1297,7 +1316,10 @@ def setUpClass(cls):
1297
1316
1298
1317
@classmethod
1299
1318
def tearDownClass (cls ):
1300
- if cls ._databases_support_transactions ():
1319
+ if (
1320
+ cls ._databases_support_transactions ()
1321
+ and cls ._databases_support_savepoints ()
1322
+ ):
1301
1323
cls ._rollback_atomics (cls .cls_atomics )
1302
1324
for conn in connections .all (initialized_only = True ):
1303
1325
conn .close ()
@@ -1323,6 +1345,15 @@ def _fixture_setup(self):
1323
1345
if self .reset_sequences :
1324
1346
raise TypeError ("reset_sequences cannot be used on TestCase instances" )
1325
1347
self .atomics = self ._enter_atomics ()
1348
+ if not self ._databases_support_savepoints ():
1349
+ if self .fixtures :
1350
+ for db_name in self ._databases_names (include_mirrors = False ):
1351
+ call_command (
1352
+ "loaddata" ,
1353
+ * self .fixtures ,
1354
+ ** {"verbosity" : 0 , "database" : db_name },
1355
+ )
1356
+ self .setUpTestData ()
1326
1357
1327
1358
def _fixture_teardown (self ):
1328
1359
if not self ._databases_support_transactions ():
0 commit comments