KOSA Spring - Transaction

채정윤·2025년 4월 23일

Spring

목록 보기
20/25

트랜잭션이란?

  • 트랜잭션(Transaction): 하나의 작업 단위. 여러 작업(쿼리)이 모두 성공하거나, 모두 실패해야 함.

✅ ACID

은행 계좌 이체 예시 (A → B 계좌로 10만원 이체)

ACID 속성의미은행 이체 예시
Atomicity(원자성)모두 성공 or 모두 실패A 계좌에서 10만원 출금 & B 계좌에 10만원 입금→ 하나라도 실패하면 둘 다 취소
Consistency(일관성)DB 규칙을 항상 만족이체 전후에 총 금액(잔고 합계)은 변하지 않음
Isolation(격리성)다른 트랜잭션과 영향 없음동시에 여러 사용자가 이체를 해도 각 이체가 서로 간섭하지 않음
Durability(지속성)완료된 작업은 영구 저장이체 완료 후 시스템이 꺼져도 결과는 DB에 남아 있음

예제

root-context.xml

데이터베이스와 같은 외부 리소스에서 트랜잭션을 관리하는 역할

(먼저 namespace에서 tx 체크)

	<tx:annotation-driven/>
	
	<bean id="transationManager"
		class = "org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource"></property>
	</bean>

DB

create table tbl_sample1(
    col1 varchar2(50)
)

create table tbl_sample2(
    col2 varchar2(500)
)

Sample1Mapper.java

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);

}

Sample2Mapper.java

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);

}

SampleTxService.java

package org.zerock.service;

public interface SampleTxService {
	public void addData(String data);
}

SampleTxServiceImpl.java

...
@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);
	}
}

ServiceTests.java

...
@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이 있어야 여러 작업을 하나의 트랜잭션으로 묶을 수 있음

0개의 댓글