SQLAlchemy线程中的事务是否安全?

时间:2015-06-09 14:20:47

标签: python sqlalchemy

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

2 个答案:

答案 0 :(得分:4)

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

  

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

  

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

     

会话的使用方式应该是单个事务中的一系列操作存在一个实例。

     

更重要的是,你不应该想要使用多个并发线程的会话。

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

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

  

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

答案 1 :(得分:3)

我认为你将原子性与孤立混为一谈。

原子性通常通过交易和担忧完整性来处理。

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

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