Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy中的事务是否线程安全?_Python_Sqlalchemy - Fatal编程技术网

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

Python SQLAlchemy中的事务是否线程安全?,python,sqlalchemy,Python,Sqlalchemy,我正在使用SQLAlchemy的表达式语言开发一个web应用程序,而不是它的orm。我想在我的应用程序中使用多个线程,但我不确定线程的安全性。我正在用它建立连接。我认为这是线程安全的,因为我在每个请求中引用一个特定的连接。这个线程安全吗?我认为你把原子性和隔离混淆了 原子性通常是通过事务处理的,涉及到完整性 隔离是关于对数据库表的并发读/写(因此线程安全)。例如:如果要增加表记录的int字段,则必须选择该记录的字段,增加值并更新它。如果多个线程同时执行此操作,则结果将取决于读/写的顺序 文档表示

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

我认为你把原子性和隔离混淆了

原子性通常是通过事务处理的,涉及到完整性

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

文档表示,这两个线程都不是线程安全的,也不打算在线程之间共享

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

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

会话的使用方式应确保一个事务中的一系列操作都有一个实例

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

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

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

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


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