我在sqlite (开发服务器)中使用sqlalchemy,并且刚刚发现在更新查询之后,下一个web请求中的查询返回过时的数据集(这取决于请求使用哪个线程,因为我知道有一个线程池)。
我正在使用scoped_session和docs (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-查询不相交。
发布于 2013-09-08 23:44:46
你需要激活pyramid_tm吐温。
[app:main]
pyramid.includes =
pyramid_tm吐温在每个请求之后提交事务,在新请求传入时隐式地启动一个新事务。
当您不启动新事务时,旧事务将不会看到在其他事务(线程)中提交的数据;这是数据库事务的固有特性,因为不这样做会导致不一致错误。
发布于 2013-09-08 13:19:31
您可以使用要获取的值的数据库对象发出一个Session.refresh。
https://stackoverflow.com/questions/18683909
复制相似问题