이전에 거래를 사용할 때 문제가 발생했습니다. 누군가가 알아낼 수 있기를 바랍니다. 나는 어떤 도움을 주셔서 감사하겠습니다. 고맙습니다.서로 다른 트랜잭션의 데이터를 업데이트하기 위해 인덱싱 된 열과 인덱싱되지 않은 열을 사용하는 것의 차이점은 무엇입니까?
MySQL의 테이블 구조 :
create table test (
id int not null,
someid int,
name varchar(50),
update_date datetime
);
primary key : id (auto-inc)
index1 : id (unique)
index2 : id, update_date (non-unique)
자바 방법
여기// consider this method is Transaction 1
method1() {
A. set session transaction isolation level read commited;
B. select update_date from test where someid = 1;
C. insert into test values (some new data..);
D. select update_date from test where someid = 1;
}
// consider this method is Transaction 2
methodb() {
E. (start with default transaction isolation level - repeatable read)
F. update test set udpate_date = now() where someid = 1;
}
내가 짓이다
- 방법 항목()를 실행하고 (Eclipse에서 설정된 브레이크 포인트) 침입 D
- execute method2() concurrent
"someid"는 색인에 없지만 "id"와 똑같은 데이터를 저장한다는 점에 유의하십시오.
그렇다면 트랜잭션 1을 커밋하지 않는 한 기다리는 동안 아무 것도 얻지 못하거나 결국 트랜잭션 시간 초과로 끝날 것입니다. 하지만 만약 id = 1이 F의 where 절을 변경했다면 아무런 대기없이 잘 작동 할 것입니다. 내가 테이블이나 행을 잠그지 않았으므로 혼란스러워졌습니다. 내가 그랬다면 안된다. 그렇지?
아무도 왜이 말을 들려 줄 수 있습니까? 고맙습니다!
답장을 보내 주셔서 감사합니다. 업데이트가 어떻게 효과가 있었는지에 대해 이해합니다. 적어도 그렇게 생각합니다. 글쎄, 나는 거래에 익숙하지 않다. 그러나 격리 수준이 적어도 갱신 통계에 영향을 준다는 것을 믿기는 거의 어렵다 :-) – redfoxlee
btw : 격리 수준이 잠금 모드에 영향을주는 것처럼 보입니다. 하지만이 경우에는 READ COMMITED와 REPEATABLE READ의 차이점을 알 수 없습니다. – redfoxlee