SQLAlchemy会话中操作独立数据库区域的并发任务是否安全?
关于Sqlalchemy会话并发使用的疑问
环境配置
原同步执行的操作流程:
start session read table A read table B read table C write table A write table B write table C commit tx
问题描述
Sqlalchemy文档明确说明,会话不应在多线程/异步任务中共享使用,原因是底层会话包含事务状态这类可变状态。我想知道如果任务操作的是数据库的独立区域,是否可以运行多个并发任务?比如执行以下操作是否安全:
start session read table A, B, C in 3 concurrent tasks write table A, B, C in 3 concurrent tasks commit tx
回答
绝对不安全,哪怕操作的是数据库的独立区域也不行。
Sqlalchemy的Session本身不具备线程安全/异步安全特性,它内部维护着事务状态、对象缓存(identity map)等可变状态,并发操作会同时修改这些状态,进而引发数据错乱、事务状态异常、甚至数据库死锁等问题——比如多个任务同时写入Session的事务日志,或者读操作的缓存被异步写操作污染,最终commit时根本无法确认哪些修改是有效的。
哪怕A、B、C三张表相互独立,Session自身的全局状态是共享的,并发操作必然会破坏它的一致性。正确的做法是给每个并发任务分配独立的Session,各自完成读写后单独提交;如果需要全局事务保障,就老老实实同步执行,不要用并发。
内容的提问来源于stack exchange,提问作者user607722
相关产品推荐
相关产品推荐

