정의 : 트랜잭션은 데이터베이스 시스템에서 수행되는 작업의 논리적인 단위입니다. 트랜잭션은 하나 이상의 데이터베이스 조작(예: 삽입, 갱신, 삭제)을 포함하며, 이러한 조작들은 모두 성공하거나 모두 실패해야 합니다. 트랜잭션은 데이터베이스의 일관성을 유지하기 위한 중요한 개념이며, ACID 속성을 가지고 있습니다.
ACID는 트랜잭션이 안전하게 수행되기 위한 네 가지 속성을 나타냅니다
원자성(Atomicity):
트랜잭션의 모든 조작은 원자적으로 실행되어야 합니다. 즉, 모든 조작은 성공적으로 완료되거나 어떠한 조작도 수행되지 않은 것처럼 롤백되어야 합니다. 어느 하나라도 실패하면 트랜잭션 전체가 실패해야 합니다.
일관성(Consistency):
트랜잭션이 완료된 후에는 데이터베이스가 일관된 상태로 유지되어야 합니다. 트랜잭션이 일부만 적용되어 데이터베이스가 불일치한 상태로 남아서는 안 됩니다.
const mysql = require('mysql');
// MySQL 연결 정보
const connection = mysql.createConnection({
host: 'localhost',
user: 'your_username',
password: 'your_password',
database: 'your_database',
});
// 연결
connection.connect((err) => {
if (err) {
console.error('Error connecting to MySQL:', err);
return;
}
console.log('Connected to MySQL');
});
// 트랜잭션 시작
connection.beginTransaction((err) => {
if (err) throw err;
// 예시: 두 개의 SQL 쿼리를 실행
const query1 = 'INSERT INTO users (username, email) VALUES (?, ?)';
const values1 = ['john_doe', 'john@example.com'];
const query2 = 'UPDATE products SET stock = stock - 1 WHERE product_id = ?';
const values2 = [123];
// 첫 번째 쿼리 실행
connection.query(query1, values1, (error, results1) => {
if (error) {
return connection.rollback(() => {
throw error;
});
}
// 두 번째 쿼리 실행
connection.query(query2, values2, (err, results2) => {
if (err) {
return connection.rollback(() => {
throw err;
});
}
// 트랜잭션 커밋
connection.commit((commitErr) => {
if (commitErr) {
return connection.rollback(() => {
throw commitErr;
});
}
console.log('Transaction Complete.');
connection.end(); // 연결 종료
});
});
});
});
chat gpt를 통해 빠르게 예시코드를 얻었고 확인해보았다.
기존에 사용하던 방법과 차이가 있다면 단순 쿼리만을 실행시키는것이 아닌 시작을 connection.beginTransaction((err) =>
함수로 실행함으로서 트랜잭션이라는 한개의 단계를 더 만들어준 걸로 이해했다.
그래서 이 코드에서는 beginTransaction
, commit
, rollback
메서드를 사용하여 트랜잭션을 시작, 성공적으로 완료, 실패할 경우 롤백하는 과정을 보여주고 있다.
앞선 설명에서 자세하게 나왔든 결국 트랜잭션이라는 것은 하나의 작업단위 라는 게 핵심이다.
db에 쿼리를 날리기전 하나의 단계를 더 거치기 때문에 안전성이 돋보이는 기능인 것 같다.
일반적으로는 그냥 쿼리만 날려도 큰 무리가 없다라고 하면 오히려 번거로울 수 있지만, 우리가 깃헙을 사용해서 코드를 이전으로 되돌리듯이 쿼리도 상황에따라서 이것을 실행을 중지해야하거나 되돌려야 되는 상황들이 분명히 있을 것이고,
이것을 사람이 판단하는게 아니라 트랜잭션이라는 하나의 과정을 더 만듬으로써 크로스 체크가 되는 일련의 작업이라고 볼 수 있을 것 같다.
하지만 트랜잭션으로 결제쿼리 실행 => 대기 => 주소확인쿼리 실행 => 오류 => 하나라도 오류라서 롤백
이러한 순서로 진행이 되면 실행한걸 되돌린다기보다는 실행을 멈춰놓고 보류하는 상황이기 때문에 그냥 롤백할 수 있고 충분히 안정적으로 사용할 수 있을것 같다.
-고 객이 계좌이체를 요청하는 경우, 출금과 입금 두 개의 데이터 조작이 필요합니다. 트랜잭션을 사용하면 이 두 조작을 하나의 단위로 처리하여 어느 하나라도 실패하면 전체 트랜잭션을 롤백할 수 있습니다. 이를 통해 잔액 부정확이나 중간에 거래가 실패하는 등의 문제를 방지할 수 있습니다.
찾아보니 생각보다 트랜잭션의 사용유무가 단순 롤백의 역활도 있겠지만 원자적으로 수행하는 관점에서 많이 사용이 된다는 것도 알게 되었다