使用SQLAlchemy与引擎/连接而不是会话是否是线程安全的?

时间:2017-02-10 13:41:47

标签: python sqlalchemy

我有一个简单的Web服务,使用SQLAlchemy使用模式连接到数据库

engine = create_engine(database_uri)
connection = engine.connect()

在服务的每个端点中,我以下列方式使用相同的连接:

for result in connection.execute(query):
    <do something fancy>

由于Session不是线程安全的,我担心connection s也不是。

我可以安全地继续这样做吗?如果没有,最简单的方法是什么?

次要注意 - 我不知道该服务是否会运行多线程,但我宁愿确保它不会遇到麻烦。

1 个答案:

答案 0 :(得分:1)

简短回答:你应该没事。

connectionSession之间存在差异。简短的描述是连接只代表......与数据库的连接。你传递给它的信息会很明显。它不会跟踪您的交易,除非您告诉它,并且它不关心您发送数据的顺序。因此,如果在创建Sprocket对象之前创建Widget对象很重要,那么最好在线程安全的上下文中调用它。如果您想跟踪数据库事务,通常也是如此。

另一方面,

Session会为您跟踪数据和交易。如果您check out the source code,您会在数据库事务中反复注意到并且无法知道您在事务中拥有所需的所有内容,那么最终可能会在一个线程中提交而你希望能够在另一个对象中添加另一个对象(或几个)。

如果您不知道交易是什么this is Wikipedia,但简短版本是交易有助于确保您的数据保持稳定。如果您有15个插入和更新,并且插入15失败,您可能不想创建另一个14.事务将允许您批量取消整个操作。