代码之家  ›  专栏  ›  技术社区  ›  pavithra rox

如何实现具有节点承诺的事务

  •  -1
  • pavithra rox  · 技术社区  · 8 年前

    我正在用开发应用程序 node ,请 mysql angular4 .在这里,我有一组与单个任务相关的函数。所有这些都是异步函数,可以处理像这样的承诺

    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 功能。我该如何回滚所有内容?

    2 回复  |  直到 8 年前
        1
  •  0
  •   manish kumar    8 年前

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

    所以每一个承诺都有决心、拒绝和阻碍

    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
  •  0
  •   pavithra rox    8 年前

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