Python SQLAlchemy中的事务是否线程安全?
我正在使用SQLAlchemy的表达式语言开发一个web应用程序,而不是它的orm。我想在我的应用程序中使用多个线程,但我不确定线程的安全性。我正在用它建立连接。我认为这是线程安全的,因为我在每个请求中引用一个特定的连接。这个线程安全吗?我认为你把原子性和隔离混淆了 原子性通常是通过事务处理的,涉及到完整性 隔离是关于对数据库表的并发读/写(因此线程安全)。例如:如果要增加表记录的int字段,则必须Python SQLAlchemy中的事务是否线程安全?,python,sqlalchemy,Python,Sqlalchemy,我正在使用SQLAlchemy的表达式语言开发一个web应用程序,而不是它的orm。我想在我的应用程序中使用多个线程,但我不确定线程的安全性。我正在用它建立连接。我认为这是线程安全的,因为我在每个请求中引用一个特定的连接。这个线程安全吗?我认为你把原子性和隔离混淆了 原子性通常是通过事务处理的,涉及到完整性 隔离是关于对数据库表的并发读/写(因此线程安全)。例如:如果要增加表记录的int字段,则必须选择该记录的字段,增加值并更新它。如果多个线程同时执行此操作,则结果将取决于读/写的顺序 文档表示
选择该记录的字段,增加值并更新它。如果多个线程同时执行此操作,则结果将取决于读/写的顺序
文档表示,这两个线程都不是线程安全的,也不打算在线程之间共享
连接对象不是线程安全的。虽然可以使用正确同步的访问在线程之间共享连接,但底层DBAPI连接可能不支持线程之间的共享访问。有关详细信息,请查看DBAPI文档
会话非常适合以非并发方式使用,这通常意味着一次只能使用一个线程
会话的使用方式应确保一个事务中的一系列操作都有一个实例
更重要的一点是,您不应该希望将会话与多个并发线程一起使用
当在多个线程中使用相同的连接(和事务上下文)时,无法保证行为是正确的或一致的
每个线程应该使用一个连接或会话。如果需要对数据进行保证,则应设置引擎或会话的隔离级别。对于web应用程序,SQLAlchemy使用每个请求周期一个连接
web请求和线程的这种简单对应意味着,将会话与线程关联意味着它也与该线程中运行的web请求关联,反之亦然,前提是该会话仅在web请求开始后创建,并在web请求结束前拆除
这取决于是否有一个线程在处理与事务相关的事情,然后有另一个线程在同一个连接上发出一个commit
。。。现在线程#1将不再在事务中,并发出“裸”查询。每个上下文不都有自己的连接,在with完成时关闭吗?