Sangil's blog

https://github.com/ChoiSangIl Admin

nodeJs mssql async, await transaction(트랜젝션) 처리 DEV / SERVER

2020-02-14 posted by sang12


서비스 로직 쪽을 개발하다 보면 여러개의 작업(디비 인서트 업데이트 딜리트 )을 수행 하다 하나의 로직에서 오류가 나면 전체를 롤백시켜야하는 경우가 있습니다. 그럴경우 하나의 트랜잭션으로 뭌어서 롤백처리 하는데요. 이번에 NodeJs에서 mssql과 연동하여 트랜잭션을 설정하는 방법을 알아보겠습니다

mssqlTransactionTest.js

const sql = require('mssql')
const dbConfigMssql = require('/dbconfig/dbconfig-mssql.js');

async function mssqlTransactionTest() {
    const conn = await new sql.connect(dbConfigMssql);
    const transaction = new sql.Transaction();

    try {
        await new Promise(resolve => transaction.begin(resolve));
        const request = new sql.Request(transaction)

        let result1 = await request.query("insert into TBTT1(col1) VALUES('111')");
        let result2 = await request.query("insert into TBTT2(col1) VALUES('XXXXXXXXXXXXXXXXXXXXXXXXXXXXX') ");
        let result3 = await request.query("insert into TBTT3(col1) VALUES('111')");

        await transaction.commit();
    } catch(err){
        await transaction.rollback();
        console.log("Error: " + err);
    };
}

mssqlTransactionTest();

dbconfig-mssql.js


module.exports = {
	user: '',
	password: '',
	server: '',
	port : '',
	database: '',
	options: {
		encrypt: false,
		enableArithAbort: true
	},
	pool:{
		max: 10,
		min: 1,
		idleTimeoutMills: 30000
	}
};

테스트 하기위해 mssql에 tbtt란 테이블을 생성했고 두번째 쿼리에서 컬럼값보다 큰값을 넣어서 오류를 생성하였습니다. 일반적으로 트랜잭션 처리를 하지 않으면 첫번째 쿼리의 데이터가 들어가게되는데요. 해당소스는 트랜잭션을 설정하고 catch문에서 롤백을 호출하기 때문에 전체 데이터가 안들어가는것을 볼 수있습니다. 그런데 트랜잭션을 잡아 놓고 커밋이나 롤백을 호출하지 않으면 테이블락이 잡혀서 셀렉트조차 안되더라구요. 오라클에선 로우락을 잡고 셀렉트도 정상적으로 되었는데 말이죠. 커밋과 롤백을 전절히 사용하여 테이블 락이 걸리는일이 없도록 주의해야겠네요.

#mssql 트랜잭션 #mssql transaction #mssql async transaction #mssql await 트랜잭션
REPLY