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 와 같은 모듈들이 있다.

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
56 Node.js로 ES6 코드 실행하기 (Babel) file 황제낙엽 2023.01.07 370
55 자바스크립트 CommonJS 모듈 내보내기/불러오기 (require) file 황제낙엽 2023.01.07 331
54 Node.js에서 ES 모듈(import/export) 사용하기 file 황제낙엽 2023.01.07 600
53 CommonJS 와 ES 의 Module 시스템 황제낙엽 2023.01.07 337
52 [session] 기본 - Express-session 기반 로그인 세션 관리 황제낙엽 2022.01.03 308
51 [session] 기본 - 2 file 황제낙엽 2022.01.03 327
50 [session] 기본 - 1 황제낙엽 2022.01.03 326
49 [T아카데미] Node.js 프로그램 기초부터 응용까지 강좌 모음 황제낙엽 2021.03.15 235
48 Node.js 에서 Bulk INSERT 를 하는 방법 (multi insert) 황제낙엽 2021.02.02 1363
47 mysql, mysql2 모듈 버전 비교 황제낙엽 2021.01.31 595
46 [T아카데미/Node.js 프로그래밍] 프로그램 흐름 제어 (콜백지옥, Async, Promise) file 황제낙엽 2021.01.27 349
45 ORM 툴 Sequelize file 황제낙엽 2021.01.27 334
44 [connection과 pool-05] pool 생성이 너무 많은 경우의 database에서의 에러 - Too many connections file 황제낙엽 2021.01.27 483
43 [connection과 pool-04] connection pool 에서의 Transaction을 이용한 commit 과 rollback 황제낙엽 2021.01.27 341
42 [connection과 pool-03] mysql.createPool 과 connection.query 황제낙엽 2021.01.27 940
41 [connection과 pool-02] mysql.createPool 과 pool.query 황제낙엽 2021.01.27 460
40 [connection과 pool-01] mysql.createConnection 과 connection.query 황제낙엽 2021.01.27 388
39 [T아카데미/Node.js 프로그래밍/MySQL] createPool, getConnection 의 간단한 예제 (강의 예제) 황제낙엽 2021.01.27 379
38 여러 개의 데이터 베이스 연결을 동시에 관리하는 PoolCluster 황제낙엽 2021.01.16 2698
37 connetion pooling 과 connection leak 황제낙엽 2021.01.16 359