【问题标题】:How to implement transactions with node promises如何使用节点承诺实现交易
【发布时间】:2018-11-20 07:39:44
【问题描述】:

我正在使用nodemysqlangular4 开发应用程序。在那里,我有一组与单个任务相关的功能。所有这些都是异步函数,适用于看起来像这样的 Promise

setAprroveTrue(curentHOD, user, group, message, approvemail, approved_byHR = 0) { //HR or super admin can override anyones leave. default it is set as not by and hr.
        return new Promise((resolve, reject) => {
            Leaves.setHodMessage(group, message, curentHOD).then((messageArr) => {
                q = "update leave_taken_superior_map set lstm_col_status= ? ,ltsm_all_approved = 1,ltsm_overide_by_hr = ?,ltsm_message = ? where ltsm_group_id = ?;update leave_taken set alt_leave_approved = 1 where alt_group_by = ?";
                params = [config.key_word_approved_leave, approved_byHR, messageArr, group, group];
                sqlq.executeQuery(q, params).then((data) => {
                    if (approvemail === true) {
                        emails.sendEmail('pavithrarox1@gmail.com', 'pavithra@gmail.lk', 'Good news! Your leave request has been approved', emails.getLeaveApprovedEmail(group))
                    } else {
                        emails.sendEmail('pavithrarox1@gmail.com', 'pavithra@gmail.lk', 'Bad news! Your leave request has been rejected', emails.getLeaveDissapprovedEmail(group))
                    }
                    //no need to wait for email to send.it will work as a background procass
                    resolve(data)
                }).catch((err) => {
                    console.log(err)
                    reject(err)
                });
            }).catch((err) => {
                reject(err)
            })
        })
    } 

如何在这个函数中实现交易? 因此,如果setHodMessage 函数成功执行并且executeQuery 函数出现问题。我如何回滚所有内容?

【问题讨论】:

  • 看起来你已经实现了。如果当前实现有问题,请在问题中明确说明。
  • 不,我还没有在这里实现交易。在 setHodMessage 方法中,它用一些数据更新数据库表,在 executeQuery 函数中也做同样的事情。但是如果由于某种原因未执行 executeQuery 函数,则没有执行 setHodMessage 方法的意义。所以我想回滚那里发生的事情。
  • 现在我很困惑:这个问题是关于如何 implement transactions in mysql 或关于 nodejs ?
  • 当我们使用带有promises的nodejs时如何在mysql中实现事务
  • 如何在 mysql 中实现事务与您用来调用数据库的语言没有任何关系。事务在数据库中实现。

标签: mysql node.js asynchronous transactions promise


【解决方案1】:

您可以处理拒绝案例并同样应用逻辑。

所以每个promise都有resolve和reject以及一个catch块

promise.then(
      resolved=>{},
      reject=>{}
).catch(error=>{});

所以在你的情况下。

setAprroveTrue(curentHOD, user, group, message, approvemail, approved_byHR = 0) { //HR or super admin can override anyones leave. default it is set as not by and hr.
        return new Promise((resolve, reject) => {
            Leaves.setHodMessage(group, message, curentHOD).then((messageArr) => {
                q = "update leave_taken_superior_map set lstm_col_status= ? ,ltsm_all_approved = 1,ltsm_overide_by_hr = ?,ltsm_message = ? where ltsm_group_id = ?;update leave_taken set alt_leave_approved = 1 where alt_group_by = ?";
                params = [config.key_word_approved_leave, approved_byHR, messageArr, group, group];
                sqlq.executeQuery(q, params).then((data) => {
                    if (approvemail === true) {
                        emails.sendEmail('pavithrarox1@gmail.com', 'pavithra@gmail.lk', 'Good news! Your leave request has been approved', emails.getLeaveApprovedEmail(group))
                    } else {
                        emails.sendEmail('pavithrarox1@gmail.com', 'pavithra@gmail.lk', 'Bad news! Your leave request has been rejected', emails.getLeaveDissapprovedEmail(group))
                    }
                    //no need to wait for email to send.it will work as a background procass
                    resolve(data)
                },()=>{  
                        //do your rollback stuff here
                      }).catch((err) => {
                    console.log(err)
                    reject(err)
                });
            }).catch((err) => {
                reject(err)
            })
        })
    } 

如果您需要任何帮助,请告诉我。

【讨论】:

    【解决方案2】:

    好的,我在这里找到了问题。我无法让事务在我的应用程序上运行的原因是因为我使用了mysql.createPool 而不是mysql.createConnection。在 createPool 中没有实现事务的选项

    【讨论】:

      猜你喜欢
      • 2014-05-22
      • 2016-05-17
      • 2018-05-24
      • 2018-08-13
      • 2016-01-08
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2016-03-27
      相关资源
      最近更新 更多