문제 설명
일부 인터페이스는 비정상이고 일부 데이터 인터페이스는 정상입니다. 예외가 발생했습니다. 자동 커밋이 활성화되면 커밋 할 수 없습니다. 특정 예외는 이보다 길지만 주된 이유는 데이터베이스의 자동 커밋 구성과 관련이 있습니다.
문제 환경
springmvc 프로젝트는 Ali의 druid를 데이터베이스 연결 풀로 사용합니다.
조사 과정
소스 코드를 통해 spring-tx 트랜잭션의 DataSourceTransactionManager가 매번 다음 코드를 실행 함을 알 수 있습니다.
if (con.getAutoCommit ()) { txObject.setMustRestoreAutoCommit (true); if (logger.isDebugEnabled ()) { logger.debug ( "JDBC 연결 ["+ con + "]을 수동 커밋으로 전환"); } con.setAutoCommit (false); }
즉, Spring이 연결될 때마다 AutoCommit = false로 설정되지만 여기서는 분명히 효과적이지 않습니다. 왜 효과가 없나요? 그런 다음 의심 대상이 데이터 소스로 전송되고 데이터 소스는 Ali의 druid 연결 풀을 사용하므로 드루이드 버그로 의심되며 다음은 druid 연결 풀을 대체하는 것과 같습니다.
연결 풀 교체
HikariCP와의 연결 풀을 교체 한 후, HikariCP 지원은 AUTOCOMMIT = false를 설정. 다시 테스트 한 후 , 문제가 발견되지 않습니다. 알리의 드루이드 연결 풀의 문제를 결정한다 .
해결책
1. 해결하려면 데이터베이스 속성 autocommit = false를 구성합니다.
데이터베이스를 구성하지 않으려면 다음 방법을 참조하십시오.
2. 연결 풀을 교체하고 Ali의 druid 연결 풀을 사용하지 마십시오.