node.js - 为什么 sequelize 事务 t.lock.UPDATE 不会阻塞其他事务?

标签 node.js sequelize.js postgresql-9.3

            var promises = [];
            promises.push(
                sequelize.transaction(function(t1) {
                    return models.car_service.findAll({
                        where: sequelize.and(
                            { "id_dtc": 6},
                            { "id_car": 95 }
                        ),
                        transaction: t1,
                        lock: t1.LOCK.UPDATE,
                        logging: console.log
                    }).then(function(result) {
                        console.log(result.dataValues);
                        if(!result.dataValues){
                        return models.car_service.create(
                            {
                                id_dtc: 6,
                                id_car: 95,
                                priority: config.get('apiConfig.coreControllerConfig.createIssueOptions.DTCPriority'),
                                status: 'new',
                                dtc_is_pending: false
                            });
                        }
                    })
                })
            );
            promises.push(
                sequelize.transaction(function(t2) {
                    return models.car_service.findAll({
                        where: sequelize.and(
                            { "id_dtc": 6},
                            { "id_car": 95 }
                        ),
                        transaction: t2,
                        lock: t2.LOCK.UPDATE,
                        logging: console.log
                    }).then(function(result) {
                        console.log(result.dataValues);
                        if(! result.dataValues){
                        return models.car_service.create(
                            {
                                id_dtc: 6,
                                id_car: 95,
                                priority: config.get('apiConfig.coreControllerConfig.createIssueOptions.DTCPriority'),
                                status: 'new',
                                dtc_is_pending: false
                            });
                        }
                    })
                })
            );
            return promise.all(promises).then(function(results) {
                console.log(results);
            });

日志是

Executing (14a1c614-c2f1-46a1-a99f-89bc92ca23dc): SELECT "id", "status",        "priority", "mileage", "done_at", "created_at", "updated_at", "id_car",   "id_service_type", "id_service_edmunds", "id_service_customized", "id_recall_recallmasters", "id_service_archive", "id_service_mmy", "id_service_preset", "id_dtc", "dtc_is_pending" FROM "car_service" AS "car_service" WHERE ("car_service"."id_dtc" = 6 AND "car_service"."id_car" = 95) FOR UPDATE;
Executing (084558cc-730d-441a-a794-aaa27898db77): SELECT "id", "status", "priority", "mileage", "done_at", "created_at", "updated_at", "id_car", "id_service_type", "id_service_edmunds", "id_service_customized", "id_recall_recallmasters", "id_service_archive", "id_service_mmy", "id_service_preset", "id_dtc", "dtc_is_pending" FROM "car_service" AS "car_service" WHERE ("car_service"."id_dtc" = 6 AND "car_service"."id_car" = 95) FOR UPDATE;

undefined
undefined

有谁知道为什么我仍然在表中添加 2 个相同的行,我认为行锁应该阻止具有选择更新的事务?

最佳答案

您必须在交易的第二个查询中传入相应的交易对象 {transaction: t1}{transaction: t2} 作为选项。

引用示例 ( in the documentation )

关于node.js - 为什么 sequelize 事务 t.lock.UPDATE 不会阻塞其他事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40097043/

相关文章:

node.js - Nodejs - 处理和发送多部分请求,

javascript - 在 Node 中验证用户时得到奇怪的输出

javascript - 在从第一个表返回的条件或返回从 foreach 派生的数组中返回空对象值的位置上进行 Sequelize 连接

mysql - Sequelize,在多个表中批量创建,如果出现错误则所有创建失败

sql - Postgresql INSERT RETURNING 复杂类型

node.js - NodeJS 流出 AWS Lambda 函数

javascript - 代码在生产环境和本地环境中表现不同

node.js - 如何使用 native node.js 驱动程序将用户名/密码连接到 mongodb

postgresql - 如何在 postgresql 中自动增加字母数字值?

node.js - 如果关键字为 null 则获取所有行,否则返回匹配