은행 계좌 이체 예시 (A → B 계좌로 10만원 이체)
| ACID 속성 | 의미 | 은행 이체 예시 |
|---|---|---|
| Atomicity(원자성) | 모두 성공 or 모두 실패 | A 계좌에서 10만원 출금 & B 계좌에 10만원 입금→ 하나라도 실패하면 둘 다 취소 |
| Consistency(일관성) | DB 규칙을 항상 만족 | 이체 전후에 총 금액(잔고 합계)은 변하지 않음 |
| Isolation(격리성) | 다른 트랜잭션과 영향 없음 | 동시에 여러 사용자가 이체를 해도 각 이체가 서로 간섭하지 않음 |
| Durability(지속성) | 완료된 작업은 영구 저장 | 이체 완료 후 시스템이 꺼져도 결과는 DB에 남아 있음 |
데이터베이스와 같은 외부 리소스에서 트랜잭션을 관리하는 역할
(먼저 namespace에서 tx 체크)
<tx:annotation-driven/>
<bean id="transationManager"
class = "org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"></property>
</bean>
create table tbl_sample1(
col1 varchar2(50)
)
create table tbl_sample2(
col2 varchar2(500)
)
package org.zerock.mapper;
import org.apache.ibatis.annotations.Insert;
public interface Sample1Mapper {
@Insert("insert into tbl_sample1 (col1) values (#{data})")
public int insertCol1(String data);
}
package org.zerock.mapper;
import org.apache.ibatis.annotations.Insert;
public interface Sample2Mapper {
@Insert("insert into tbl_sample2 (col2) values (#{data})")
public int insertCol2(String data);
}
package org.zerock.service;
public interface SampleTxService {
public void addData(String data);
}
...
@Service
@Log4j
public class SampleTxServiceImpl implements SampleTxService {
@Autowired
private Sample1Mapper mapper1;
@Autowired
private Sample2Mapper mapper2;
@Transactional
@Override
public void addData(String data) {
log.info("mapper1...............");
mapper1.insertCol1(data);
log.info("mapper2....................");
mapper2.insertCol2(data);
}
}

...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTxServiceTests {
@Autowired
private SampleTxService service;
@Test
public void test() {
String str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
service.addData(str);
}
}
@Transaction 을 안했을때는 50자 이상 담을 수 있는 col1에만 데이터가 들어가있음
하지만 @Transaction 을 했을때는 모두 데이터가 들어가지 않게됨
⇒ Atomicity
@Transactional이 있어야 여러 작업을 하나의 트랜잭션으로 묶을 수 있음