0

데이터베이스에 큐가 있습니다 (하나의 테이블에 열이 있고 열거 형이며 큐, 완료 및 작동 상태가 있습니다) 그리고 트랜잭션을 실행하여 특정 행 상태가 큐에서 작동하도록 변경합니다 또는 작업을 완료해야하지만 우선 행을 선택하기 위해 복잡한 쿼리를 실행해야합니다. 그래서 지금, 첫번째 응용 프로그램이 다음는 트랜잭션 내에서 (작업에 대기열에서 상태를 변경, 업데이 트를 실행하는 선택 실행 행을 얻을, 응용 프로그램은 봄 부팅로 작성된 API이며, 그리고 jdbctemplate을 사용하여 MySQL 데이터베이스에 액세스합니다.이 선택 및 변경 상태에 사용하는 방법은 @Transactional 주석으로 표시됩니다. 또한 API ()를 사용하는 응용 프로그램 ()은 다중 스레드이므로이 트랜잭션 중 두 개 이상이 동시에 실행됩니다 (API에 대한 다중 호출).MySQL 큐 트랜잭션

동일한 행을 반환 할 수 있습니까? 예 : T1, T2 트랜잭션, S1, S2 선택, U1, U2 업데이트. 실행 순서 : T1이

T1 { S1 --->U1 } 

    T2 { S2 ----->U2} 

제 2 선택 실행 첫 번째 업데이트 전에 T2와 동시에 시작, 그래서 그들은 모두 같은 행을 반환 할 수 있습니다?

답변

0

예, 2 개의 SELECT 문이 동일한 값을 가진 동일한 레코드를 반환 할 가능성이 있습니다. 데이터를 쿼리하는 동안 적용한 잠금 및 격리 수준에 따라 달라질 수 있습니다.

자세한 내용은 Understanding pdo mysql transactions SO 주제를 참조하십시오.

+0

격리 수준을 변경해도 올바르게 이해하면 도움이되지 않지만 여전히 동일한 행을 선택할 수 있습니다. – appl3r

+0

직렬화 가능 격리 수준을 사용하는 경우 2 트랜잭션은 동일한 행을 선택할 수 없습니다. 사실상이 분리 레벨은 MySQL이 select가 건 드리는 모든 레코드를 잠그도록합니다. 그러나 명시 적 행 레벨 잠금으로 동일하게 달성 할 수 있습니다. – Shadow

+0

My select on은 단일 행을 선택하므로 (끝에서 LIMIT 1 사용) 격리 수준에서 수행해야합니다. – appl3r