MariaDB(MySQL)의 기본 설정값인 Repetable Read - Isolation level로 인해 PHANTOM READ 현상을 겪으며 한참 헤맸음. 이래서 Real MySQL 봐야 하는구나
간단히 잘 정리된 글 :
트랜잭션의 격리 수준(isolation Level)이란?
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);
}
}