0

我正在将 sqlalchemy 与 sqlite 引擎(开发服务器)一起使用,并且刚刚发现在更新查询之后,下一个 Web 请求中的查询返回过时的数据集(这取决于哪个线程用于请求,据我所知有一个池线程)。

我正在使用docs ( )scoped_session中的其他推荐内容。DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

这是 Web 请求的示例以及在那里执行的内容。

request-1:thread-1: SELECT * FROM table WHERE id=1 -> (id:1, data:1)
request-2:thread-2: UPDATE table SET data=2 WHERE id=1; COMMIT
request-3:thread-1: SELECT * FROM table WHERE id=1 -> (id:1, data:1) // STILL data:1 !
request-4:thread-4: SELECT * FROM table WHERE id=1 -> (id:1, data:2) // NEW DATA!     
request-5:thread-1: SELECT * FROM table WHERE id=1 -> (id:1, data:1) // AND AGAIN OLD DATA!

这是什么?我怎样才能避免这种行为?在上面的示例中,所有 Web 请求都按连续顺序执行,因此 SQL 查询不会相交。

4

2 回答 2

1

Session.refresh您可以使用要获取其值的数据库对象发出 a 。

于 2013-09-08T13:19:31.197 回答
0

您需要激活pyramid_tm补间。

[app:main]

pyramid.includes =
    pyramid_tm

tween 在每次请求后提交事务,当有新请求进入时隐式启动事务。

不启动新事务时,事务将看不到其他事务(线程)中提交的数据;这是数据库事务的固有特性,因为不这样做会导致不一致错误。

于 2013-09-08T23:44:46.540 回答