중화사전망 - 서예자전 - Java 프로그램에서 MySQL 데이터베이스의 테이블을 잠그는 방법

Java 프로그램에서 MySQL 데이터베이스의 테이블을 잠그는 방법

메소드 1: MySQL 명령을 사용하여 테이블을 잠급니다.

공공? 허공? 테스트 ()? {

문자열? Sql? =? \ "잠금? 책상? Aa 1? 쓰기 \ ";

//? 아니면 현악인가요? Sql? =? \ "잠금? 책상? Aa 1? 읽기 "; -응?

//? 여러 테이블을 잠그려면 다음을 수행합니다. 잠궈요? 책상? Aa 1? 읽기? , aa2? 쓰기? ,? ......?

문자열? Sql 1? =? "선택? *? 어디서 왔어요? Aa 1? " 을 눌러 섹션을 인쇄할 수도 있습니다

문자열? Sql2? =? "잠금 해제? 양식 ";

해봐? {

This.pstmt? =? Conn.prepare statement (SQL);

This.pstmt 1? =? Conn.preparestatement (SQL1);

This. PS mt2? =? Conn.preparestatement (sql2);

Pstmt.executequery ();

Pstmt1.executequery ();

Pstmt2.executequery ();

}? 받아요? (예외? E)? {

System.out.println ("예외"? +? E. getmessage ());

}

} 읽기 및 쓰기 잠금에 대한 공식 설명:

1. 스레드가 테이블의 읽기 잠금을 획득할 경우 스레드 (및 기타 모든 스레드) 는 테이블에서만 읽을 수 있습니다.

스레드가 테이블의 쓰기 잠금을 획득한 경우 잠금을 유지하는 스레드만 테이블에 쓸 수 있습니다.

잠금이 해제될 때까지 다른 스레드가 차단됩니다.

2. 테이블 잠금을 사용할 때 질의에 사용할 모든 테이블을 잠가야 합니다.

LOCKTABLES 문을 사용하여 얻은 잠금은 여전히 유효하지만 해당 문에 의해 잠기지 않은 테이블에는 액세스할 수 없습니다.

동시에 한 쿼리에서 잠긴 테이블을 여러 번 사용할 수 없습니다. 대신 별칭을 사용합니다.

이 경우 각 별칭에 대한 잠금을 개별적으로 가져와야 합니다.

읽기 잠금 및 쓰기 잠금에 대한 개인 지침:

1. 읽기 및 쓰기 잠금은 스레드 레벨 (테이블 레벨) 입니다.

2. 읽기 잠금은 동일한 세션에 추가됩니다. 이 테이블만 읽을 수 있습니다. 이 테이블을 제외한 모든 테이블을 추가, 삭제, 수정 또는 검색할 수 없습니다.

그러나 세션마다 읽기 잠금이 있는 테이블만 읽을 수 있지만 읽기 잠금이 아닌 테이블은 추가, 삭제, 수정 및 검색할 수 있습니다.

3. 동일한 세션에서 쓰기 잠금을 추가합니다. 이 테이블만 읽고 쓸 수 있습니다. 이 테이블을 제외한 모든 테이블을 추가, 삭제, 수정 또는 검색할 수 없습니다.

그러나 다른 세션에서는 쓰기 잠금을 사용하여 테이블을 읽거나 쓸 수 없지만 쓰기 잠금 외에 테이블을 추가, 삭제, 수정 및 찾을 수 있습니다.

4. 테이블에 별칭이 사용된 경우. (이름 테이블을 통해 AA 1 에서 * 선택)

Aa 1 을 잠글 때 Name _ TableRead 잠금 테이블 AA 1As 를 통해 별칭을 추가해야 합니다.

같은 세션에서. 질의에 별칭을 사용해야 합니다.

서로 다른 세션에서 조회를 위해 별칭을 사용할 필요가 없습니다.

5. 여러 세션에서 동일한 테이블에 대해 잠금 읽기 작업을 수행할 수 있지만, 여러 세션에서 동일한 테이블에 대해 잠금 쓰기 작업을 수행할 수는 없습니다. 이러한 잠금은 잠긴 테이블이 스레드 잠금을 해제할 때까지 기다립니다.

여러 세션이 동일한 테이블을 읽기 위해 잠겨 있는 경우 이러한 세션에서는 잠긴 테이블만 읽을 수 있습니다.

6. 테이블을 잠그려면 질의를 중첩해야 합니다. 별칭 및 잠금 별칭을 사용해야 합니다.

예를 들면 다음과 같습니다. 잠금 테이블 AA 1 읽기, AA 1 as by name _ table 읽기;

Select * from aa1where id in (select * from aa1as xx where id = 2);

잠금 해제 테이블은 잠금 해제에 사용해야합니다.

또한:

자바 프로그램에서 잠금을 해제하려면 unlock tables 를 호출하여 잠금을 해제해야 합니다.

잠금 해제 테이블이 호출되지 않은 경우

연결을 닫고, 프로그램을 종료하고, GC 를 호출하여 잠금을 해제할 수 있습니다.

방법 2: 레코드를 사용하여 테이블을 잠급니다.

공공? 허공? 테스트 ()? {

문자열? Sql? =? "선택? *? 어디서 왔어요? Aa 1? 뭐 때문에? 업데이트 "; -응?

//? 선택? *? 어디서 왔어요? Aa 1? 잠궈요? 네? 공유? 모드; -응?

해봐? {

Conn.set 자동 commit (false);

This.pstmt? =? Conn.prepare statement (SQL);

Pstmt.executequery ();

}? 받아요? (예외? E)? {

System.out.println ("예외"? +? E. getmessage ());

}

} 1.for update 및 공유 모드의 잠금은 행 및 페이지 레벨 잠금입니다.

2. 단독 잠금 업데이트의 경우 공유 모드에서 잠금 * * * * 을 즐길 수 있습니다.

3. 레코드 잠금의 경우 트랜잭션을 열어야 합니다.

4. 행 레벨 잠금은 실제로 인덱스 레코드의 잠금입니다. 인덱스로 스캔된 행 (또는 인덱스로 스캔되지 않은 행) 만 잠깁니다.

5. next-key 잠금 알고리즘은 서로 다른 격리 수준에서 사용됩니다. 즉, 스캔라인 사이의 "간격" 도 잠깁니다 (반복 가능한 읽기 및 직렬화 가능한 격리 수준에서 간격 잠금).

6. MySQL 에서 * * * 잠금은 내용이 수정되었지만 커밋되지 않은 경우에도 다른 세션에서 최근에 수정된 정보를 볼 수 있다는 의미입니다.

* * * 동일한 세션에서 잠금을 추가합니다. 이 테이블과 이 테이블을 제외한 모든 테이블을 추가, 삭제, 수정 및 검색할 수 있습니다.

여러 세션에서 * * * * 잠긴 행에 대한 최신 메시지를 찾을 수 있지만 Read Uncommitted 격리 수준에서 잠긴 테이블을 삭제할 수는 없습니다.

조작을 바꾸다. (잠금 해제될 때까지 기다려야 합니다 ...)

Read Committed 격리 수준에서는 잠긴 테이블을 삭제하거나 변경할 수 없습니다. (잠금 해제될 때까지 기다려야 합니다 ...)

반복 가능한 읽기 격리 수준에서는 잠긴 행을 추가, 삭제 또는 수정할 수 없습니다. (잠금 해제될 때까지 기다려야 합니다 ...)

Serializable 격리 수준에서 잠긴 행을 추가, 제거 또는 수정할 수 없습니다. (잠금 해제될 때까지 기다려야 합니다 ...)

7. MySQL 에서 exclusive locks 는 exclusive lock 에 의해 잠긴 행에서 내용 수정이 아직 커밋되지 않아 다른 세션에서 가장 최근에 수정된 정보를 볼 수 없다는 의미입니다.

여러 세션에서 * * * * 잠긴 행에 대한 최신 메시지를 찾을 수 있지만 Read Uncommitted 격리 수준에서 잠긴 테이블을 삭제할 수는 없습니다.

조작을 바꾸다. (잠금 해제될 때까지 기다려야 합니다 ...)

Read Committed 격리 수준에서는 잠긴 테이블을 삭제하거나 변경할 수 없습니다. (잠금 해제될 때까지 기다려야 합니다 ...)

반복 가능한 읽기 격리 수준에서는 잠긴 행을 추가, 삭제 또는 수정할 수 없습니다. (잠금 해제될 때까지 기다려야 합니다 ...)

직렬화 가능한 격리 수준에서는 잠긴 행을 추가, 삭제 또는 수정할 수 없습니다.

8. 같은 세션에서 여러 * * * 잠금 및 독점 잠금을 중첩할 수 있습니다. 여러 세션에서 잠금이 해제될 때까지 기다려야 합니다.

9.9 호 업데이트. SQL 과 update 의 원리는 같습니다.

10. 대기 시간 초과에 대한 매개 변수 설정: innodb_lock_wait_timeout=50 (단위 초).

1 1. 트랜잭션 제출을 트리거하는 모든 명령은 배타적 잠금 및 배타적 잠금을 해제할 수 있습니다.