# 개요
- 하나의 로직에서 여러 개의 쿼리문(insert, update, delete 등)을 실행할 때 중간에 에러가 나면 이전에 실행한 쿼리문의 결과들을 다시 원래의 상태로 되돌려야 됩니다
💡Ex
insert 쿼리1
insert 쿼리2
→ 이렇게 실행할 때 쿼리1은 정상적으로 실행 but 쿼리2에서 오류! → 쿼리1에서 insert된 정보를 삭제해야 됨!
- 이럴 때 트랜잭션을 사용하면 굳이 delete 쿼리문을 작성하지 않아도 알아서 관리해 줍니다
# 사용 방법
- db 설정파일 혹은 서버 코드에서 생성한 Pool객체를 가져옵니다 → const pool = require('../dbConfig');
- 트랜잭션을 시작하고 싶은 곳에서 BEGIN → await pool.query('BEGIN'); // 트랜잭션 시작
- 트랜잭션을 종료합니다
- 모든 작업 성공 시 COMMIT → await pool.query('COMMIT'); // 트랜잭션 커밋
- 작업 중 오류 발생 시 catch부분에서 ROLLBACK → await pool.query('ROLLBACK'); // 트랜잭션 롤백
# 코드 예시
- test 테이블 상태
- 테이블 상태에 보면 test_nm이 Not Null
[testRouter.js]
const express = require('express');
const queries = require('../queries'); // db 설정파일 (접속 정보, 쿼리 로그 설정 등)
const pool = require('../dbConfig'); // 실행 쿼리
const router = express.Router();
router.get('/add', async (req, res) => {
const testName = 'test'; // POST 요청에서 testName 파라미터를 가져옴
try {
await pool.query('BEGIN'); // 트랜잭션 시작
await queries.insertTest(testName); // insert 쿼리 1
await queries.insertTest(null); // insert 쿼리 2
await pool.query('COMMIT'); // 트랜잭션 커밋
} catch (error) {
await pool.query('ROLLBACK'); // 트랜잭션 롤백
}
});
module.exports = router;
[queries.js]
const pool = require('./dbConfig');
const insertTest = async (test_nm) => {
try {
await pool.query('INSERT INTO test (test_seq_no, test_nm) VALUES (nextval($1), $2)', ['sq_test', test_nm]);
return { success: true, message: 'test created successfully' };
} catch (error) {
console.error('Error executing query:', error);
throw error;
}
};
module.exports = {
insertTest
};
# 결과
# 실패 ROLLBACK
- testRouter 코드의 2번째 insert문을 확인해 보면 무조건 넣어줘야 하는 test_nm값을 null로 넣어줘서 오류 발생
# 성공 COMMIT
- 코드를 아래와 같이 수정하면 성공적으로 COMMIT 되는 걸 볼 수 있습니다
- 테이블에도 정상적으로 INSERT
router.get('/add', async (req, res) => {
try {
await pool.query('BEGIN'); // 트랜잭션 시작
await queries.insertTest('test1111'); // insert 쿼리 1
await queries.insertTest('test2222'); // insert 쿼리 2
await pool.query('COMMIT'); // 트랜잭션 커밋
} catch (error) {
await pool.query('ROLLBACK'); // 트랜잭션 롤백
}
});
'Framework > Node.js' 카테고리의 다른 글
[Node.js] Windows - OpenSSL 설치부터 Node에 HTTPS 적용 (0) | 2024.05.22 |
---|---|
[Node.js] 쿼리 실행 시 로그 출력 (0) | 2024.05.07 |