MySQL (MariaDB) Isolation Level 때무네

kimki·2022년 7월 14일
0

Spring ( Boot ) / Java

목록 보기
5/5

MariaDB(MySQL)의 기본 설정값인 Repetable Read - Isolation level로 인해 PHANTOM READ 현상을 겪으며 한참 헤맸음. 이래서 Real MySQL 봐야 하는구나

간단히 잘 정리된 글 :
트랜잭션의 격리 수준(isolation Level)이란?

  • MigFileServerTaskBLOImpl.java 에서 storageFileBLO.exists 로직 수행시 하단의 sql이 1로 나와야 정상 동작하나,
    사용중인 MariaDB my.ini 설정의 isolation level이 기본값인 Repetable Read로 되어 있어서 0으로 조회 되었음.
    MariaDB 세팅 가이드 등을 참고해서 반드시 Read Commited로 변경해야 해당 모듈이 정상 동작함.
  • 원인: 해당 모듈은 StorageFile을 Create 하고, 후에 해당 값을 Select 하는 로직이 한 트랜잭션 내에 같이 있는데,
    MariaDB(MySQL)의 기본 설정값인 Repetable Read - Isolation level은 한 트랜잭션내에 Select는 동일한 값을 보장하는 방식임.(트랜잭션 중 변경 내용을 반영하지 않음)

package 회사.custom.LINK;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * 
 * @author YounggiKimA
 *	MigFileServerTaskBLOImpl.java 에서 storageFileBLO.exists 로직 수행시 하단의 sql이 1로 나와야 정상 동작하나,
 *	사용중인 MariaDB my.ini 설정의 isolation level이 기본값인 Repetable Read로 되어 있어서 0으로 조회 되었음.
 *	MariaDB 세팅 가이드 등을 참고해서 반드시 Read Commited로 변경해야 해당 모듈이 정상 동작함.
 *
 *	원인: 해당 모듈은 StorageFile을 Create 하고, 후에 해당 값을 Select 하는 로직이 한 트랜잭션 내에 같이 있는데,
 *	MariaDB(MySQL)의 기본 설정값인 Repetable Read - Isolation level은 한 트랜잭션내에 Select는 동일한 값을 보장하는 방식임.(트랜잭션 중 변경 내용을 반영하지 않음)
 *
 */
public class TestConnection {
	public static void main(String[] args) throws Exception {
		Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/회사mig?user=회사DB계정&password=회사DB비번");
		System.out.println(">>>>>" + conn.getMetaData());
		String sql = "SELECT Count(1) FROM StorageFile WHERE StorageFileID = '1657761305000000000' AND SomeblahblahStatus = 'N'";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		Integer i=0;
		if(rs.next()){
			i = rs.getInt(1);
		}
		System.out.println(i);
	}
}
profile
개발 자라는 사람.

0개의 댓글