Web/Spring

스프링 트랜잭션

프로그래멍 2020. 6. 9. 23:58

비즈니스에서는 쪼개질 수 없는 하나의 단위 작업을 말할 때 '트랜잭션(Transaction)'이라는 용어를 사용한다.

사전적인 의미로 트랜잭션은 '거래'라는 뜻을 가지지만, 현실적으로는 '한 번에 이루어지는 작업의 단위'를 트랜잭션으로 간주한다.

 

ACID 원칙

 

'트랜잭션으로 관리한다' 혹은 '트랜잭션으로 묶는다'는 ㅍ현은 프로그래밍에서는 'AND' 연산과 유사하다.

영소계층에서 '출금'과 '입금'은 각각 데이터베이스와 연결을 맺고 처리하는데 하나의 트랜잭션으로 처리해야 할 경우에는 한쪽이 잘못되는 경우에 이미 성공한 작업까지 다시 원상태로 복구되어야 한다.

스프링은 이러한 트랜잭션 처리를 간단히 XML 설정을 이용하거나, 어노테이션 처리만으로 할 수 있다.

 


데이터베이스 설계와 트랜잭션

 

데이터베이스의 정규화가 잘 되어있거나 규칙들이 잘 반영된 데이터베이스의 설계에서는 '트랜잭션'이 많이 일어나지 않는다. 정규화가 진행될수록 테이블은 점점 더 순수한 형태가 되어가는데, 순수한 형태가 될수록 '트랜잭션 처리'의 대상에서 멀어진다.

 


트랜잭션 설정

 

pom.xml 추가

 : spring-jdbc, spring-tx, mybatis, mybatis-spring, hikariCP 라이브러리 추가

 

root-context >> Namespaces >> tx 체크

 

	<context:annotation-config></context:annotation-config>

	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">

		<property name="driverClassName"
			value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
		<property name="jdbcUrl"
			value="jdbc:log4jdbc:oracle:thin:@localhost:1521:XE"></property>
		<property name="username" value="book_ex"></property>
		<property name="password" value="book_ex"></property>

	</bean>

	<!-- HikariCP configuration -->
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close">
		<constructor-arg ref="hikariConfig" />
	</bean>

	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<tx:annotation-driven />

	<mybatis-spring:scan
		base-package="org.zerock.mapper" />

 

<bean>으로 등록된 transactionManager와 <tx:annotation-driven /> 설정이 추가된 후에는 트랜잭션이 필요한 상황을 만들어서 어노테이션을 추가하는 방식으로 설정하게 된다.

 


실습

 

2개의 테이블을 생성.

테이블
테스트

1번 테이블에는 insert가 되고 2번 테이블은 길이가 50이기 때문에 insert가 안된다.

 

@Transactional 어노테이션

만일 트랜잭션 처리가 되었다면 1테이블과 2테이블 모두 insert가 되지 않았어야 되므로, 트랜잭션 처리가 될 수 있도록 @Transactional을 추가한다.

 

@Transactional 어노테이션 속성들

전파(Propagation)속성

478p