【问题标题】:SQLAlchemy(Python)/Sequelize(Node.js) rollback transation (undo button)SQLAlchemy(Python)/Sequelize(Node.js) 回滚事务(撤消按钮)
【发布时间】:2020-06-02 21:38:27
【问题描述】:

所以我现在正在使用 GraphQL 和带有 SQLAlchemy 的 Python 或带有 Sequelize 的 Node.js 开发一个后端 API,以将所有数据写入 SQLite 数据库。

我仍然不确定最终会使用什么后端。也许这个问题和我的问题的答案会导致我使用其中一个。

所以我的应用程序将具有一个功能,您可以在其中将飞镖投掷(如双 20、三重 19...)添加到带有投掷的表格中。根据选择的游戏和选择的条件,此投掷将从总计数中减去,或者可能添加到计数器表或类似的东西中。

每次添加投掷时,都会检查游戏是否获胜以及其他一些检查。这些也可能将数据写入(提交)到数据库。

现在,如果用户输入了错误的数字/或者自动飞镖机会发现错误的投掷数(故障),那么我将不得不回滚数据库中的投掷和几个更改的数据。

在 darts scorer 应用程序中,您会在应用商店中找到 ios 或 android,您始终会有一个撤消按钮,该按钮将从数据库中删除投掷以及因输入错误投掷而导致的所有“效果”。

作为一名前 mssql 管理员,我的第一个想法是事务日志和回滚功能。但是在网上搜索了一段时间后,我了解到 SQLAlchemy 和 Sequelize 只会在异常时回滚事务。

我是否可以通过点击按钮/调用诸如“/undo”之类的rest api路径来故意回滚最后一个“完成”事务(意味着例如函数将在函数结束时进行的所有更改),如果是这样的话我缺少 SQLAlchemy 或 Sequelize 的任何代码 sn-ps 吗?

最好的问候, 帕特里克

编辑:

所提供答案的集合:

  • 命令模式(python)

【问题讨论】:

    标签: python node.js sqlalchemy sequelize.js


    【解决方案1】:

    根据Can I rollback a transaction I've already committed? (data loss) 和其他来源,不,您不能回滚已提交的事务。这也是依赖于数据库的,所以不需要对 ORM 或语言做太多。

    我建议实现Command pattern,这对Undo 非常有用。所以基本上是从代码中还原,而不是从数据库中还原。

    【讨论】:

    • 所以你说它是数据库依赖。那么使用 mysql/mariadb 或 postgresql 会改变使用回滚的能力吗?因为如果是这样,我会毫不犹豫地这样做,因为我已经在使用 ORM,它不会打扰我切换后端,我猜?
    • 不确定是否有支持此功能的数据库,但回滚通常是出现问题时,但您的方案最好使用代码。
    • 我使用命令模式查看了提供的链接。关于我的代码,这可能是最重要的。请不要误会,但这比我目前所能处理的要复杂。
    • 我阅读了有关命令模式的更多信息并观看了一些视频。我知道我必须维护一堆命令,稍后我可以引用这些命令来引用撤消操作。但是由于我的应用程序是 api 驱动的(烧瓶路由),我将没有对象可以实例化并稍后参考。所以命令模式不起作用,对吧? @horatiu
    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 2020-09-24
    • 2011-02-24
    • 2016-06-22
    • 2013-05-10
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多