summaryrefslogtreecommitdiff
path: root/test/orm/test_transaction.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/test_transaction.py')
-rw-r--r--test/orm/test_transaction.py279
1 files changed, 3 insertions, 276 deletions
diff --git a/test/orm/test_transaction.py b/test/orm/test_transaction.py
index b2e8bff79..f0ef37230 100644
--- a/test/orm/test_transaction.py
+++ b/test/orm/test_transaction.py
@@ -74,22 +74,6 @@ class SessionTransactionTest(fixtures.RemovesEvents, FixtureTest):
assert s._legacy_transaction() is tran
tran.close()
- def test_subtransaction_on_external_subtrans(self, conn):
- users, User = self.tables.users, self.classes.User
-
- self.mapper_registry.map_imperatively(User, users)
-
- trans = conn.begin()
- sess = Session(bind=conn, autocommit=False, autoflush=True)
- sess.begin(subtransactions=True)
- u = User(name="ed")
- sess.add(u)
- sess.flush()
- sess.commit() # commit does nothing
- trans.rollback() # rolls back
- assert len(sess.query(User).all()) == 0
- sess.close()
-
def test_subtransaction_on_external_no_begin(self, conn):
users, User = self.tables.users, self.classes.User
@@ -219,71 +203,6 @@ class SessionTransactionTest(fixtures.RemovesEvents, FixtureTest):
assert u1 in session
@testing.requires.savepoints
- def test_heavy_nesting(self):
- users = self.tables.users
-
- session = fixture_session()
- session.begin()
- session.connection().execute(users.insert().values(name="user1"))
- session.begin(subtransactions=True)
- session.begin_nested()
- session.connection().execute(users.insert().values(name="user2"))
- assert (
- session.connection()
- .exec_driver_sql("select count(1) from users")
- .scalar()
- == 2
- )
- session.rollback()
- assert (
- session.connection()
- .exec_driver_sql("select count(1) from users")
- .scalar()
- == 1
- )
- session.connection().execute(users.insert().values(name="user3"))
- session.commit()
- assert (
- session.connection()
- .exec_driver_sql("select count(1) from users")
- .scalar()
- == 2
- )
-
- @testing.requires.savepoints
- def test_heavy_nesting_future(self):
- users = self.tables.users
-
- engine = Engine._future_facade(testing.db)
- with Session(engine, autocommit=False) as session:
- session.begin()
- session.connection().execute(users.insert().values(name="user1"))
- session.begin(subtransactions=True)
- session.begin_nested()
- session.connection().execute(users.insert().values(name="user2"))
- assert (
- session.connection()
- .exec_driver_sql("select count(1) from users")
- .scalar()
- == 2
- )
- session.rollback()
- assert (
- session.connection()
- .exec_driver_sql("select count(1) from users")
- .scalar()
- == 1
- )
- session.connection().execute(users.insert().values(name="user3"))
- session.commit()
- assert (
- session.connection()
- .exec_driver_sql("select count(1) from users")
- .scalar()
- == 2
- )
-
- @testing.requires.savepoints
def test_dirty_state_transferred_deep_nesting(self):
User, users = self.classes.User, self.tables.users
@@ -368,7 +287,7 @@ class SessionTransactionTest(fixtures.RemovesEvents, FixtureTest):
self.mapper_registry.map_imperatively(Address, addresses)
engine2 = engines.testing_engine()
- sess = fixture_session(autocommit=True, autoflush=False, twophase=True)
+ sess = fixture_session(autoflush=False, twophase=True)
sess.bind_mapper(User, testing.db)
sess.bind_mapper(Address, engine2)
sess.begin()
@@ -411,20 +330,6 @@ class SessionTransactionTest(fixtures.RemovesEvents, FixtureTest):
assert not c2.invalidated
assert c2.connection.is_valid
- def test_subtransaction_on_noautocommit(self):
- User, users = self.classes.User, self.tables.users
-
- self.mapper_registry.map_imperatively(User, users)
- sess = fixture_session(autocommit=False, autoflush=True)
- sess.begin(subtransactions=True)
- u = User(name="u1")
- sess.add(u)
- sess.flush()
- sess.commit() # commit does nothing
- sess.rollback() # rolls back
- assert len(sess.query(User).all()) == 0
- sess.close()
-
@testing.requires.savepoints
def test_nested_transaction(self):
User, users = self.classes.User, self.tables.users
@@ -499,7 +404,7 @@ class SessionTransactionTest(fixtures.RemovesEvents, FixtureTest):
self.mapper_registry.map_imperatively(User, users)
- sess = fixture_session(autocommit=True)
+ sess = fixture_session()
sess.begin()
sess.begin_nested()
@@ -516,6 +421,7 @@ class SessionTransactionTest(fixtures.RemovesEvents, FixtureTest):
sess.commit()
eq_(set(sess.query(User).all()), set([u2]))
+ sess.rollback()
sess.begin()
sess.begin_nested()
@@ -530,38 +436,6 @@ class SessionTransactionTest(fixtures.RemovesEvents, FixtureTest):
sess.close()
@testing.requires.savepoints
- def test_mixed_transaction_control(self):
- users, User = self.tables.users, self.classes.User
-
- self.mapper_registry.map_imperatively(User, users)
-
- sess = fixture_session(autocommit=True)
-
- sess.begin()
- sess.begin_nested()
- transaction = sess.begin(subtransactions=True)
-
- sess.add(User(name="u1"))
-
- transaction.commit()
- sess.commit()
- sess.commit()
-
- sess.close()
-
- eq_(len(sess.query(User).all()), 1)
-
- t1 = sess.begin()
- t2 = sess.begin_nested()
-
- sess.add(User(name="u2"))
-
- t2.commit()
- assert sess._legacy_transaction() is t1
-
- sess.close()
-
- @testing.requires.savepoints
def test_mixed_transaction_close(self):
users, User = self.tables.users, self.classes.User
@@ -682,26 +556,6 @@ class SessionTransactionTest(fixtures.RemovesEvents, FixtureTest):
sess.commit,
)
- def test_error_on_using_inactive_session_commands(self):
- users, User = self.tables.users, self.classes.User
-
- self.mapper_registry.map_imperatively(User, users)
- sess = fixture_session(autocommit=True)
- sess.begin()
- sess.begin(subtransactions=True)
- sess.add(User(name="u1"))
- sess.flush()
- sess.rollback()
- assert_raises_message(
- sa_exc.InvalidRequestError,
- "This session is in 'inactive' state, due to the SQL transaction "
- "being rolled back; no further SQL can be emitted within this "
- "transaction.",
- sess.begin,
- subtransactions=True,
- )
- sess.close()
-
def test_no_sql_during_commit(self):
sess = fixture_session(autocommit=False)
@@ -836,36 +690,6 @@ class SessionTransactionTest(fixtures.RemovesEvents, FixtureTest):
trans.commit,
)
- def test_deactive_status_check(self):
- sess = fixture_session()
- trans = sess.begin()
- trans2 = sess.begin(subtransactions=True)
- trans2.rollback()
- assert_raises_message(
- sa_exc.InvalidRequestError,
- "This session is in 'inactive' state, due to the SQL transaction "
- "being rolled back; no further SQL can be emitted within this "
- "transaction.",
- trans.commit,
- )
-
- def test_deactive_status_check_w_exception(self):
- sess = fixture_session()
- trans = sess.begin()
- trans2 = sess.begin(subtransactions=True)
- try:
- raise Exception("test")
- except Exception:
- trans2.rollback(_capture_exception=True)
- assert_raises_message(
- sa_exc.PendingRollbackError,
- r"This Session's transaction has been rolled back due to a "
- r"previous exception during flush. To begin a new transaction "
- r"with this Session, first issue Session.rollback\(\). "
- r"Original exception was: test",
- trans.commit,
- )
-
def _inactive_flushed_session_fixture(self):
users, User = self.tables.users, self.classes.User
@@ -1954,103 +1778,6 @@ class AccountingFlagsTest(_LocalFixture):
assert u1.name == "edward"
-class AutoCommitTest(_LocalFixture):
- __backend__ = True
-
- def test_begin_nested_requires_trans(self):
- sess = fixture_session(autocommit=True)
- assert_raises(sa_exc.InvalidRequestError, sess.begin_nested)
-
- def test_begin_preflush(self):
- User = self.classes.User
- sess = fixture_session(autocommit=True)
-
- u1 = User(name="ed")
- sess.add(u1)
-
- sess.begin()
- u2 = User(name="some other user")
- sess.add(u2)
- sess.rollback()
- assert u2 not in sess
- assert u1 in sess
- assert sess.query(User).filter_by(name="ed").one() is u1
-
- def test_accounting_commit_fails_add(self):
- User = self.classes.User
- sess = fixture_session(autocommit=True)
-
- fail = False
-
- def fail_fn(*arg, **kw):
- if fail:
- raise Exception("commit fails")
-
- event.listen(sess, "after_flush_postexec", fail_fn)
- u1 = User(name="ed")
- sess.add(u1)
-
- fail = True
- assert_raises(Exception, sess.flush)
- fail = False
-
- assert u1 not in sess
- u1new = User(id=2, name="fred")
- sess.add(u1new)
- sess.add(u1)
- sess.flush()
- assert u1 in sess
- eq_(
- sess.query(User.name).order_by(User.name).all(),
- [("ed",), ("fred",)],
- )
-
- def test_accounting_commit_fails_delete(self):
- User = self.classes.User
- sess = fixture_session(autocommit=True)
-
- fail = False
-
- def fail_fn(*arg, **kw):
- if fail:
- raise Exception("commit fails")
-
- event.listen(sess, "after_flush_postexec", fail_fn)
- u1 = User(name="ed")
- sess.add(u1)
- sess.flush()
-
- sess.delete(u1)
- fail = True
- assert_raises(Exception, sess.flush)
- fail = False
-
- assert u1 in sess
- assert u1 not in sess.deleted
- sess.delete(u1)
- sess.flush()
- assert u1 not in sess
- eq_(sess.query(User.name).order_by(User.name).all(), [])
-
- @testing.requires.updateable_autoincrement_pks
- def test_accounting_no_select_needed(self):
- """test that flush accounting works on non-expired instances
- when autocommit=True/expire_on_commit=True."""
-
- User = self.classes.User
- sess = fixture_session(autocommit=True, expire_on_commit=True)
-
- u1 = User(id=1, name="ed")
- sess.add(u1)
- sess.flush()
-
- u1.id = 3
- u1.name = "fred"
- self.assert_sql_count(testing.db, sess.flush, 1)
- assert "id" not in u1.__dict__
- eq_(u1.id, 3)
-
-
class ContextManagerPlusFutureTest(FixtureTest):
run_inserts = None
__backend__ = True