将会话传递给子事务的区别

时间:2017-02-22 15:17:33

标签: python sql database transactions sqlalchemy

我没有区分使用子事务和使用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。但是,我想确保在执行过程中出现故障时整个过程都恢复到初始状态。)

提前谢谢

0 个答案:

没有答案