sitelink1 https://blog.naver.com/pass4u/220027954372 
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

users 테이블과 log 테이블에 각각의 데이터를 하나의 트렌젝션으로 묶어서 수행해주는 예제이다.

 

// insert with transaction

app.post('/userstx',function(req,res){

    var user = {'userid':req.body.userid,

        'name':req.body.name,

        'address':req.body.address};

 

    connection.beginTransaction(function(err) {

        if (err) {

            throw err;

        }

        connection.query('insert into users set ?', user, function (err, result) {

            if (err) {

                console.error(err);

                connection.rollback(function () {

                    console.error('rollback error');

                    throw err;

                });

            }// if err

            console.log('insert transaction log');

            var log = {'userid': req.body.userid};

            connection.query('insert into log set ?', log, function (err, result) {

                 if (err) {

                     console.error(err);

                     connection.rollback(function () {

                        console.error('rollback error');

                         throw err;

                      });

                  }// if err

                 connection.commit(function (err) {

                    if (err) {

                        console.error(err);

                        connection.rollback(function () {

                               console.error('rollback error');

                               throw err;

                            });

                    }// if err

                    res.send(200, 'success');

 

                 });// commit

                });// insert into log

        });// inset into users

    }); // begin trnsaction

 

        connection.release();

});

 

 

 

 

먼저 connection.begintransaction을 호출한 후에, transaction이 시작되면 쿼리를 수행하기 위해서, begintrasaction안쪽 부분에서 sql 문장을 수행한다.

insert into users SQL문장을 먼저 수행한후 다음 insert into log SQL 문장을 수행하기 위해서 insert into users Query의 call back에서 insert into log SQL 문장을 수행하였다.

그 다음으로 transaction commit 처리를 insert into logs 의 callback함수에서 connection.commit을 이용해서 수행하였다. 

 

코드를 보면 알겠지만, transaction begin,insert 두개, commit을 순차 수행하기 위해서callback을 중첩 사용하였다. 코드도 복잡하고 {} 도 많다. 

이렇게 node.js의 async callback 구조로 인하여, 코드의 복잡도가 증가하는 것을 보통 callback hell(지옥)이라고 하는데, 이를 해결하기 위한 모듈로Async 와 같은 모듈들이 있다.