2

这是我的场景:第一个视图呈现表单,数据进入第二个视图,我将其存储在 DB(MySQL)中并重定向到第三个视图,该视图显示了写入 db 的内容:

Stoing to db:
    DBSession.add(object)
    transaction.commit()

DB Session:
    DBSession = scoped_session(sessionmaker(expire_on_commit=False,
                                            autocommit=False, 
                                            extension=ZopeTransactionExtension()))

之后,当我多次刷新页面时,有时我可以看到数据库更改,有时没有,一次旧数据,第二次新数据等等......当我重新启动服务器(本地,pserve)数据库数据是最新的.

也许这是创建会话的问题?

4

4 回答 4

1

检查 MySQL 的事务隔离级别

InnoDB 的默认值是REPEATABLE READ:“同一事务中的所有一致读取都读取第一次读取建立的快照。”

您可以在对 的调用中指定隔离级别create_engine。请参阅SQLAlchemy 文档

我建议您尝试READ COMMITTED隔离级别,看看是否可以解决您的问题。

于 2012-10-11T10:44:06.637 回答
0

我相信你的问题很可能是一个持久的会话。默认情况下,Pyramids 会在提交后使会话中的所有对象过期——这意味着 SQLA 将在您下次需要它们时从数据库中获取它们,并且它们将是新鲜的。

您已通过指示“expire_on_commit=False”覆盖了此默认值——因此,如果您打算让该会话对象在后续请求中获取新数据,请确保在提交更改后调用 session.expire_all()。(会话对象对于 Pyramid 中的多个请求是相同的,但不能保证您获得相同的线程范围会话)我建议不要将提交时的过期设置为 false,或使用非全局会话:请参阅http:// /docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/database/sqlalchemy.html#using-a-non-global-session

或者,您可以确保在必要时使对象过期,知道未过期的对象将按原样保留在内存中并且不会被刷新,并且可能与不同线程范围会话中的同一对象不同。

于 2013-04-03T08:20:20.320 回答
0

目前尚不清楚您的事务对象是什么或它如何连接到 SQLAlchemy 数据库会话。我在 Pyramid 文档中看不到有关事务的任何内容,也没有在您的代码中看到将事务对象链接到 SQLAlchemy 会话的任何内容,因此可能缺少一些配置。您将此代码基于什么示例?

另外:sessionmaker调用通常在文件分数处完成以创建单个会话工厂,然后重复使用该工厂从同一源创建会话对象。“ sessionmaker() 函数通常用于创建顶级会话配置,然后可以在整个应用程序中使用,而无需重复配置参数。”

可能的情况是,由于您正在创建多个会话工厂,因此有些数据应该在会话之间共享,但实际上并未共享,因为它是每个工厂创建一次。尝试只调用 sessionmaker 一次,看看是否会有所不同。

于 2012-10-15T11:34:36.653 回答
-1

问题是你正在设置expire_on_commit=False. 如果你删除它,它应该可以工作。您可以在http://docs.sqlalchemy.org/en/rel_0_8/orm/session.html#sqlalchemy.orm.session.Session.commit上阅读更多关于它的作用

于 2013-08-22T00:43:57.660 回答