[Mybatis] 트랜잭션 전파(Isolation Levels) 예제

MyBatis는 트랜잭션 전파를 지원하며, 데이터베이스 트랜잭션의 격리 수준(Isolation Level)을 설정할 수 있습니다. 격리 수준은 여러 트랜잭션이 동시에 실행될 때 데이터베이스에서 어떻게 처리되는지를 결정합니다. 아래는 격리 수준을 설정하는 예제입니다.

예제: 트랜잭션 전파 및 격리 수준 설정

  1. 매퍼 인터페이스 작성:

매퍼 인터페이스에는 트랜잭션 전파와 격리 수준을 설정할 메서드를 작성합니다.

public interface UserMapper {
    // READ_COMMITTED 격리 수준으로 설정된 트랜잭션
    @Transaction(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
    void updateUserName(Long userId, String newUsername);
}` 
  1. 매퍼 XML 파일 작성:
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
    <update id="updateUserName">
        <!-- SQL 업데이트 쿼리 -->
        UPDATE users SET username = #{param2} WHERE user_id = #{param1}
    </update>
</mapper>` 
  1. Java 코드에서 호출:
public class Main {

    public static void main(String[] args) {
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        try (SqlSession sqlSession = sessionFactory.openSession()) {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            
            // 트랜잭션 시작
            sqlSession.getConnection().setAutoCommit(false);
            
            try {
                // 트랜잭션 내에서 메서드 호출
                userMapper.updateUserName(1L, "newUsername");
                
                // 트랜잭션 커밋
                sqlSession.commit();
            } catch (Exception e) {
                // 트랜잭션 롤백
                sqlSession.rollback();
                e.printStackTrace();
            }
        }
    }
}` 

위의 예제에서는 @Transaction 어노테이션을 사용하여 트랜잭션 전파와 격리 수준을 설정합니다. 그리고 트랜잭션을 명시적으로 시작하고 커밋 또는 롤백합니다.

격리 수준을 설정하면 여러 트랜잭션이 동시에 실행될 때 데이터베이스에서의 동작을 제어할 수 있으므로, 특정 상황에 맞게 설정할 수 있습니다.