【问题标题】:Does nodejs make separate database operations in a single function as atomic?nodejs 是否将单个函数中的单独数据库操作作为原子操作?
【发布时间】:2015-07-31 23:42:39
【问题描述】:

我一直在尝试编写一些在节点 js 上运行的数据库查询,我想到了这个。我能闻到我在误解某事,但无法弄清楚它是什么。

如果节点是单线程的,那么这意味着所有的函数调用一个接一个地运行。如果有多个客户端访问同一个节点服务器,仍然会出现请求首先排队的竞争,但是只要每个请求都被一个一个地处理,这不是让所有数据库操作都在一个单个请求 原子的?

例如,假设我想 1)计算与表中某个值匹配的列数,2)如果数字超过 10,则插入一个新行。(可能可以在一个 SQL 中执行此操作查询,但假设我分别运行它们。这是一个愚蠢的例子,但我希望你明白这一点。)我会使用事务来确保匹配列的数量不会意外改变。现在,我正在考虑编写一个在没有事务的情况下运行两个查询的函数。那保证在节点上正常工作吗?

【问题讨论】:

    标签: javascript database node.js transactions


    【解决方案1】:

    我想你想运行你的第一个调用,计数,然后你想在前一个调用的回调中执行插入。

    由于 js 和 nodejs 的性质,一旦你在等待第一次调用的响应,一旦它回来并放入事件循环(所以,计数消失了,你已经有了结果在飞行中),在等待服务时,其他一切都可能发生......甚至可以在其他地方提供另一个插入,为什么不提供(让我说,您正在服务用户请求,因此由于另一个用户的请求而插入,而不是执行计数的那个)。

    也就是说,第二个用户的插入可以在第一个用户计数之后发送的插入之前提供,这意味着绑定到计数的插入正在处理错误的数据集预期大小。

    这只是您可能遇到的一种情况,但应该足以解决您的疑虑。

    【讨论】:

    • 谢谢,我明白当它与回调异步时它是不安全的。如果我在同一个请求中有两个同步数据库操作,我想这是实现原子性的另一种方式。考虑到节点的性质,可能不是最佳实践,但我只是想知道它是否可能。
    • 这些请求由于其性质而不是同步的,是吗?您可以在第一个回调中启动第二个(利用 nodejs 的异步特性)或一起启动它们(在这种情况下,它们将同时执行)。我猜你不能这样做,因为你没有合理的方法来做到这一点,而且你没有它们,因为 nodejs 旨在以不同的方式工作。
    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多