):
self.connection._dbapi_connection._reset_agent = None
+ elif self.connection._transaction is not self:
+ util.warn("transaction already deassociated from connection")
+
# we have tests that want to make sure the pool handles this
# correctly. TODO: how to disable internal assertions cleanly?
# else:
def _connection_commit_impl(self):
self.connection._commit_impl()
- def _close_impl(self):
+ def _close_impl(self, try_deactivate=False):
try:
if self.is_active:
self._connection_rollback_impl()
if self.connection._nested_transaction:
self.connection._nested_transaction._cancel()
finally:
- if self.is_active:
+ if self.is_active or try_deactivate:
self._deactivate_from_connection()
if self.connection._transaction is self:
self.connection._transaction = None
self._close_impl()
def _do_rollback(self):
- self._close_impl()
+ self._close_impl(try_deactivate=True)
def _do_commit(self):
if self.is_active:
1,
)
+ def test_deactivated_warning_ctxmanager(self, local_connection):
+ with expect_warnings(
+ "transaction already deassociated from connection"
+ ):
+ with local_connection.begin() as trans:
+ trans.rollback()
+
+ @testing.requires.savepoints
+ def test_deactivated_savepoint_warning_ctxmanager(self, local_connection):
+ with expect_warnings(
+ "nested transaction already deassociated from connection"
+ ):
+ with local_connection.begin():
+ with local_connection.begin_nested() as savepoint:
+ savepoint.rollback()
+
def test_commit_fails_flat(self, local_connection):
connection = local_connection
t1 = transaction[0]
assert not t1.is_active
- t1.rollback() # no error
+ with expect_warnings(
+ "transaction already deassociated from connection"
+ ):
+ t1.rollback() # no error
@testing.requires.savepoints_w_release
def test_savepoint_rollback_fails_flat(self, local_connection):