SQLAlchemy线程中的事务安全吗?
问题内容:
我正在使用SQLAlchemy的表达语言而不是orm开发Web应用程序。我想在我的应用程序中使用多个线程,但是我不确定线程安全性。我正在使用本文档的这一部分进行连接。我认为这是线程安全的,因为我在每个请求中都引用了一个特定的连接。这个线程安全吗?
问题答案:
用于连接和会话的文档说,这两者都不是线程安全的,也不打算在线程之间共享。
Connection对象不是线程安全的。尽管可以使用适当的同步访问在线程之间共享连接,但是基础DBAPI连接仍然可能不支持线程之间的共享访问。有关详细信息,请查阅DBAPI文档。
Session非常打算以 非并行 方式使用,这通常意味着一次仅在一个线程中使用。
会话的使用方式应使单个事务中的一系列操作存在一个实例。
更大的一点是,您不 希望 将会话与多个并发线程一起使用。
在多个线程中使用同一连接(和事务上下文)时,不能保证行为正确或一致。
每个线程应使用一个连接或会话。如果需要有关数据的保证,则应设置引擎或会话的隔离级别。对于Web应用程序,SQLAlchemy建议每个请求周期使用一个连接。
Web请求和线程的这种简单对应关系意味着,将Session与线程相关联意味着它也与在该线程中运行的Web请求相关联,反之亦然,前提是只有在Web请求开始并拆除后才创建Session在网络请求结束之前。