@@ -130,6 +130,41 @@ def test_api_exception_rollback_transaction(self):
130
130
assert BasicModel .objects .count () == 0
131
131
132
132
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
+
133
168
@unittest .skipUnless (
134
169
connection .features .uses_savepoints ,
135
170
"'atomic' requires transactions and savepoints."
0 commit comments