我没有区分使用子事务和使用sqlalchemy传递会话。任何人都可以解释下面列出的两种方法之间的区别吗?
我们假设我们有一个method_a
来电method_b
def method_a(session):
method_b(session)
def method_b(session):
session.add(SomeObject())
此外,我有两个可能的上下文管理器。第一个是通过会议
@contextmanager
def pure_session(session):
try:
yield session
session.commit()
except:
session.rollback()
raise
和第二个用于传递子事务
@contextmanager
def transactional_session(session, nested, subtransactions):
session.begin(nested=nested, subtransactions=subtransactions)
try:
yield session
except:
session.rollback()
raise
else:
session.commit()
以下执行之间的区别是什么?
session = Session()
with pure_session:
method_a(session)
session.close()
和
session = Session(autocommit=True):
with transactional_session(session=session, nested=False, subtransactions=True):
method_a(session)
session.close()
请注意,我没有将nested
设置为True。因此没有保存点。此外,对于第二种情况,autocommit被设置为True。我不知道我是否应该在此上下文中使用传递会话或使用事务。据我所知,会话是更高级的连接,跟踪非提交(刷新)的更改。另一方面,子事务处理在子函数内发生的事务。但这两种方法的区别是什么(如果我设置嵌套= False)?什么是更好的设计?
我认为子交易是一种更清洁的方式,因为影子操作会更少。
(我知道使用子事务处理不应该设置为True。但是,我想确保在执行过程中出现故障时整个过程都恢复到初始状态。)
提前谢谢