특정 작업을 전부 처리 / 실패하게 만들어 데이터의 일관성을 보장해주는 기능
ACID:
CREATE TABLE IF NOT EXISTS SPARTA
(
spartaId INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
spartaName VARCHAR(255) NOT NULL,
spartaAddress VARCHAR(255) NOT NULL
);
START TRANSACTION;
INSERT INTO SPARTA (spartaName, spartaAddress)
VALUES ('SPARTA1', 'SEOUL'),
('SPARTA2', 'BUSAN'),
('SPARTA3', 'DAEGU');
COMMIT;
START TRANSACTION;
INSERT INTO SPARTA (spartaName, spartaAddress)
VALUES ('SPARTA4', 'SEOUL'),
('SPARTA5', 'BUSAN'),
('SPARTA6', 'DAEGU');
ROLLBACK;
동시성을 제어하는 기능
해당 데이터를 점유해서 다른 트랜젝션의 접근을 막음.
aka 읽기 락(read lock)
aka 쓰기 락(write lock)
aka 데이터베이스 락
동일 행/데이터베이스의 객체에 lock을 걸어 접근/수정을 막음.
여러 테이블에 lock이 걸려서 다른 작업이 처리되지 못하게 점유하고 있는 작업이 있을 때 다른 작업이 끝나는 것을 무한정 기다리는 상태.

여러 트랜젝션이 동시에 처리될 때 다른 트랜젝션에서 변경 및 조회하는 데이터를 읽을 수 있도록 허용/거부하는 것을 결정하기 위 사용.
const { sequelize } = require("../models/index.js");
// 콜백으로 함수를 할당하여 비즈니스로직을 처리합니다.
const result = await sequelize.transaction( async(t) => {
const user = await User.create({
firstName: '용우',
lastName: '이',
}, { transaction: t }); // 해당 쿼리에 트랜잭션을 적용합니다.
return user;
});
비즈니스 로직이 성공/실패할 때 sequelize가 자체적으로 commit/rollback을 호출한다.
const { sequelize } = require("../models/index.js");
// Sequelize의 트랜잭션을 변수에 할당하여 트랜잭션을 시작합니다.
const t = await sequelize.transaction();
try {
const user = await User.create({
firstName: '용우',
lastName: '이',
}, { transaction: t }); // 해당 쿼리에 트랜잭션을 적용합니다.
// 트랜잭션을 사용한 모든 로직을 Commit, DB에 반영합니다.
await t.commit();
} catch(transactionError) {
// 에러가 발생하였다면, 트랜잭션을 사용한 모든 쿼리를 Rollback, DB에 반영하지 않습니다.
await t.rollback();
}
명시적으로 트랜젝션을 관리하기 때문에 트랜젝션의 관리현황을 명확히 알 수 있다.
commit과 rollback을 직접 호출해야한다.
const { Transaction } = require("sequelize");
const t = await sequelize.transaction({
isolationLevel: Transaction.ISOLATION_LEVELS.[
READ_UNCOMMITTED |
READ_COMMITTED |
REPEATABLEREAD |
SERIALIZABLE
];
트랜젝션 객체를 생성할 때 isolationLevel 프로퍼티를 설정할 수 있다.