@@ -130,6 +130,41 @@ def test_api_exception_rollback_transaction(self):
130130 assert BasicModel .objects .count () == 0
131131
132132
133+ @unittest .skipUnless (
134+ connection .features .uses_savepoints ,
135+ "'atomic' requires transactions and savepoints."
136+ )
137+ class MultiDBTransactionAPIExceptionTests (TestCase ):
138+ databases = '__all__'
139+
140+ def setUp (self ):
141+ self .view = APIExceptionView .as_view ()
142+ connections .databases ['default' ]['ATOMIC_REQUESTS' ] = True
143+ connections .databases ['secondary' ]['ATOMIC_REQUESTS' ] = True
144+
145+ def tearDown (self ):
146+ connections .databases ['default' ]['ATOMIC_REQUESTS' ] = False
147+ connections .databases ['secondary' ]['ATOMIC_REQUESTS' ] = False
148+
149+ def test_api_exception_rollback_transaction (self ):
150+ """
151+ Transaction is rollbacked by our transaction atomic block.
152+ """
153+ request = factory .post ('/' )
154+ num_queries = 4 if connection .features .can_release_savepoints else 3
155+ with self .assertNumQueries (num_queries ):
156+ # 1 - begin savepoint
157+ # 2 - insert
158+ # 3 - rollback savepoint
159+ # 4 - release savepoint
160+ with transaction .atomic (), transaction .atomic (using = 'secondary' ):
161+ response = self .view (request )
162+ assert transaction .get_rollback ()
163+ assert transaction .get_rollback (using = 'secondary' )
164+ assert response .status_code == status .HTTP_500_INTERNAL_SERVER_ERROR
165+ assert BasicModel .objects .count () == 0
166+
167+
133168@unittest .skipUnless (
134169 connection .features .uses_savepoints ,
135170 "'atomic' requires transactions and savepoints."
0 commit comments