gpt4 book ai didi

postgresql - 在 Sequelize 中为 Postgres 使用事务

转载 作者:行者123 更新时间:2023-12-03 22:28:46 24 4
gpt4 key购买 nike

我正在尝试在 noodejs 中进行 sequelize 的事务。我使用 postgres 作为我的数据库。当我调用 testDel 时,事务会在 testDel 中自动提交。即使事务自动提交已设置为 false。

如果我将变量 t 从 Db.transaction 传递给 testDel,那么它将等待手动提交/回滚。
我可以不将 t 传递给函数吗?它使编码变得非常复杂。

编码如下:

Db.transaction({autocommit: false}).then((t) => {
args = {vcTitle: {$ilike: '%ulie%'}};
let boDelete = true;
testDelPost(t, args)
.then(rersult =>{
if(rersult){
t.commit();
}else{
t.rollback();
}
})
});

function testDel(args){
//the result got deleted and auto committed after this destroy, it
//doesn't wait for the above transaction to decide the commit or rollback.
//If I pass t, and set traction: t in the destroy, then it work as expected
return Db.models.Post.destroy({where: args})
.then(result =>{
if(result > 0){
return true;
}else{
return false;
}
})
.error(status =>{
return error;
})
}

最佳答案

使用 Continuation Local Storage 。这会将全局级别的 Sequelize 包分配给一个“命名空间”,以便在执行事务时从它创建的所有实例都引用该命名空间。

你初始化 Sequelize 如下(假设 ES6 导入语法):

// Grab packages we need

import Sequelize from 'sequelize';
import Cls from 'continuation-local-storage';

// Assign namespace to database

Sequelize.cls = Cls.createNamespace('db');

这允许您在不显式传递 t 的情况下执行事务。它还回滚未捕获的异常(或技术上, Unresolved promise ),并提交已解决的 promise :

以下是我在生产代码中使用的示例函数,它演示了这个概念。

它...
  • 启动一个事务(PostgreSQL 中的 BEGIN;)
  • 创建一个新帐户 ( INSERT INTO "accounts"... )
  • 创建将帐户加入帐户类型 (INSERT INTO "account_type_accounts"...) 的条目
  • 创建将用户链接到帐户 (INSERT INTO "users_accounts"...) 的条目
  • 仅当以上所有操作都成功时才执行插入( COMMIT; )。如果没有,它会回滚 ( ROLLBACK; )

  • 这是代码:

    createAccount (user, accountType, query = {}) {
    // Start transaction
    return this.db.connection.transaction(() => {
    // Create the new account
    return this.db.models.Account.create(query).then(account => {
    // Associate with user & account type
    return P.all([user.addAccount(account), accountType.addAccount(account)]).then(()=> {
    // Return account back up the promise chain
    return account;
    });
    });
    });
    }

    请注意缺少 t 变量或显式回滚/提交。

    关于postgresql - 在 Sequelize 中为 Postgres 使用事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34822981/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com