2012-05-15 1 views
1

삽입 된 데이터가 대상 열보다 클 경우 mysql에서 오류가 발생합니다. 이것은 모두 긍정적 인 행동으로 보입니다.단일 DB 트랜잭션에서 데이터 잘림을 허용하는 방법은 무엇입니까?

그러나 특정 트랜잭션 기간 동안이 동작을 취소하고 싶습니다.이 tx에서는 데이터가 너무 큰 경우 잘라내기를 원합니다.

하나의 트랜잭션에 대해서만이 동작을 비활성화하는 방법이 있습니까? 다음은 JDBC 레벨에 어떻게의 the documentation입니다 :

커넥터/J 3.1.0의 JDBC 드라이버 문제 경고 나 을 시작으로 연결했다를 제외하고 JDBC 규격에서 요구하는대로는 DataTruncation 예외를 throw 으로 jdbcCompliantTruncation 등록 정보를 사용하고 false로 설정하여 구성하지 마십시오.

답변

1

동작은 MySQL 세션 변수 sql_mode에 따라 다릅니다. 연결 중에 변수를 변경하고 나중에 원래 값으로 재설정 할 수 있습니다. 내 시스템에서 sql_mode의 기본값은 다음과 같습니다

SELECT @@sql_mode; 
-- REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI,NO_AUTO_VALUE_ON_ZERO,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH 
당신은 SET SESSION sql_mode='...'와 값을 업데이트 항목 STRICT_ALL_TABLES을 제거 프로그램에서이 결과를 분석 명령문을 실행하고 마지막에 변수를 재설정 할 수 있습니다

트랜잭션. @ ripper234에 의해

편집 : 사람이 너무 경사 인 경우

private static final disableMysqlStrictMode = 
    ((String)Play.configuration.get("db.url")).contains("mysql://"); 

... 

String originalSqlMode = null; 
try { 
    if (disableMysqlStrictMode) { 
     // Strip away mysql's "strict mode" for this transaction - in case one of the columns is truncated, we don't want the entire tx to fail 
     // http://stackoverflow.com/a/10606085/11236 
     Query query = JPA.em().createNativeQuery("SELECT @@sql_mode;"); 
     originalSqlMode = (String)query.getSingleResult(); 
     String newSqlMode = originalSqlMode 
      .replace("STRICT_ALL_TABLES", "") 
      .replace("STRICT_TRANS_TABLES", "") 
      .replace(",,", ","); 
     JPA.em().createNativeQuery("SET SESSION sql_mode=?").setParameter(1, newSqlMode).executeUpdate(); 
    } 


    // Save my entity here 
    obj.save(); 


} finally { 
    if (originalSqlMode != null) { 
     // Restore original sql_mode 
     JPA.em().createNativeQuery("SET SESSION sql_mode=?").setParameter(1, originalSqlMode).executeUpdate(); 
    } 
} 

그것은 더 예쁜 형태로 포장 할 수 있습니다 : 여기

내가이 답변의 정신에 쓴 코드입니다.

+1

감사합니다. 사용을 종료 한 코드를 포함하도록 답을 편집했습니다. – ripper234

관련 문제