【问题标题】:Are transactions in SQLAlchemy thread safe?SQLAlchemy 线程中的事务是否安全?
【发布时间】:2015-06-09 23:04:54
【问题描述】:

我正在使用 SQLAlchemy 的表达式语言而不是它的 orm 开发一个 Web 应用程序。我想在我的应用程序中使用多个线程,但我不确定线程​​安全性。我正在使用this section of the documentation 建立连接。我认为这是线程安全的,因为我在每个请求中都引用了一个特定的连接。这个线程安全吗?

【问题讨论】:

  • 这取决于您是否有一个线程在做与事务相关的事情,然后让另一个线程通过同一连接发出commit ...现在线程#1 将不再处于事务中,并发出“裸”查询。
  • 不是每个上下文都有自己的连接,在 with 完成时关闭?

标签: python sqlalchemy


【解决方案1】:

connectionssessions 的文档说它们都不是线程安全的,也不打算在线程之间共享。

Connection 对象不是线程安全的。虽然可以使用适当的同步访问在线程之间共享连接,但底层 DBAPI 连接仍然可能不支持线程之间的共享访问。有关详细信息,请查看 DBAPI 文档。

Session 非常适合以非并发方式使用,这通常意味着一次只能在一个线程中使用。

应以这样一种方式使用会话,即一个实例存在于单个事务中的一系列操作。

更重要的是,您不应该想要将会话与多个并发线程一起使用。

在多个线程中使用相同的连接(和事务上下文)时,无法保证行为正确或一致。

您应该为每个线程使用一个连接或会话。如果您需要有关数据的保证,您应该为引擎或会话设置隔离级别。对于 Web 应用程序,SQLAlchemy suggests 每个请求周期使用一个连接。

Web 请求和线程的这种简单对应意味着将 Session 与线程相关联意味着它也与在该线程中运行的 Web 请求相关联,反之亦然,前提是 Session 仅在 Web 请求开始后创建并在网络请求结束前拆除。

【讨论】:

    【解决方案2】:

    我认为您将原子性与隔离混淆了。

    原子性通常通过事务处理并关注完整性。

    隔离是关于并发读/写数据库表(因此线程安全)。例如:如果要增加表记录的 int 字段,则必须select记录的字段,增加值和update。如果多个线程同时执行此操作,则结果将取决于读取/写入的顺序。

    http://docs.sqlalchemy.org/en/latest/core/engines.html?highlight=isolation#engine-creation-api

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 2012-08-21
      • 2011-12-17
      • 2018-02-14
      • 2011-12-31
      • 1970-01-01
      相关资源
      最近更新 更多