【问题标题】:Transactional SQL with Sails.jsSails.js 的事务性 SQL
【发布时间】:2013-07-21 14:43:26
【问题描述】:

所以我现在一直在使用 NodeJS/Express,我真的很想尝试使用完整的 JavaScript 堆栈重写一个相对较大的副项目,看看它是如何工作的。 Sails.js 对于支持 Web 套接字的 REST API 的 NodeJS 后端似乎是一个不错的选择,这正是我正在寻找的,但是我正在寻找解决的另一个问题,那就是 NodeJS 中的事务 SQL。

在处理 MySQL 时,我在 NodeJS 方面看到的大多数数据层/orms 似乎都不支持事务。 Sails.js(Waterline)提供的 ORM 似乎也不支持事务,这很奇怪,因为我见过提到它的地方,尽管这些 cmets 已经很老了。 Knex.js 支持事务,所以我想知道用这个替换 ORM is Sails.js 是否容易(或者 Sails.js 在核心框架中假设 Waterline)。

我还想知道除了 Bookshelf 之外是否还有基于 Knex.js 的 ORM,因为我不喜欢 Backbones Model/Collection 系统?

【问题讨论】:

  • 好奇您认为模型/收藏系统中可以改进的地方或您不喜欢的地方。

标签: node.js transactions sails.js waterline


【解决方案1】:

我们正在开发对 ORM 级别事务的原生支持: https://github.com/balderdashy/waterline/issues/62

关联可能首先出现,但交易次之。我们刚刚完成了 GROUP BY 和聚合(SUM、AVG 等)

【讨论】:

  • 这是什么状态...我只对多个表上的单个适配器事务感兴趣...我看到文档说水线有事务但没有详细说明该声明..或文档如何使用它。
  • 你是如何实际执行 groupBy 的?水线文档和帆文档上的 Ctrl+f 显示零结果。一个简单的例子会很棒。
【解决方案2】:

您仍然可以使用Model.query() 直接编写 SQL 查询。由于这是一个异步函数,您必须使用 Promise 或 async 重新序列化它。例如,使用 MySQL 适配器 async 和一个名为 User 的模型:

async.auto({
  transaction: function(next){
    User.query('BEGIN', next);
  },
  user: ['transaction', function(next) {
    User.findOne(req.param('id')).exec(next);
  }],
  // other queries in the transaction
  // ...
}, function(err, results) {
  if (err) {
    User.query('ROLLBACK', next);
    return next(err);
  }
  User.query('COMMIT', next);
  // final tasks
  res.json(results.serialize);
});

【讨论】:

  • 启用连接池时这可能不起作用。您不应该在单独的连接上运行 BEGIN、ROLLBACK 和 COMMIT。
【解决方案3】:

SailsJS 中的事务比预期的要复杂得多。目标是让 ORM 适配器知道模型上的两个非常不同的控制器操作将通过单个 MySQL 连接发送。

执行此操作的自然方法是两个编写一个新适配器,该适配器接受附加信息以指示查询属于事务调用。这样做需要更改 waterline(sails ORM 抽象模块)本身。

检查是否有帮助 - https://www.npmjs.com/package/sails-mysql-transactions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2018-08-26
    • 2019-07-19
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多