2011-12-20 2 views
3

시간 제한을 트리거하기 위해 테스트 프레임 워크에서 테이블을 잠그려고합니다. 다음 코드를 사용하여 테이블을 잠급니다.JDBC 드라이버를 사용하여 Oracle 데이터베이스의 테이블 잠금

String lock = "lock table "+ tableName +" in exclusive mode"; 
try { 
     connection = DriverManager.getConnection(_url, _username, _password); 
     connection.setAutoCommit(false); 
     Statement stmt1=connection.createStatement(); 
     stmt1.executeUpdate(lock); 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

나는 이것을 실행 한 후 페이지에 액세스하여 계정에 요소를 추가하려고합니다. 그러나 그것은 작동하지 않습니다, 자물쇠가 발생하지 않은 것 같습니다. 왜 이것이 작동하지 않는지 아는가? 나는 현재 자바에서 이것을 테스트하고 있는데 일단 수동으로 페이지를 테스트하는 동안 스레드를 잠그는 동안 잠김을 실행하면 문제가 발생할 수 있습니까?

감사합니다, 제임스는

답변

7

오라클의 문서 말 :

당신은 지정된 잠금 모드에서 전체 데이터베이스 테이블을 고정하기 위해 LOCK TABLE 문을 사용하여 공유하거나 액세스를 거부 할 수 있도록 .. 행 공유 잠금은 테이블에 대한 동시 액세스를 허용합니다. 그들은 다른 사용자가 독점적 인 사용을 위해 전체 테이블을 잠글 수 없게합니다. 트랜잭션이 커밋 또는 롤백을 발행하면 테이블 잠금은 입니다.

그래서 거래를 시작하고 유지 관리해야합니다. 다음 코드는 1 분 동안 테이블을 잠근 상태로 유지합니다.

String lock = "lock table "+ tableName +" in exclusive mode"; 
try { 
    connection = DriverManager.getConnection(_url, _username, _password); 
    connection.setAutoCommit(false); 
    Statement stmt1=connection.createStatement(); 
    stmt1.execute(lock); 
    int i = 0; 
    while (i<60) {    
     Thread.sleep(1000); //Sleep one second 
     i++;     
    } 
    connection.commit(); 

} catch (SQLException e) { 
    connection.rollback(); 
    e.printStackTrace(); 
} 
+0

롤백 할 때까지 잠글 수있는 방법이 있습니까? 다른 java 명령을 실행하는 동안 잠글 필요가 있으며 여기에 스레드를 만들지 않는 것이 좋습니다. – James

+0

충분히 공정한 나는 대답이 대답인지 여부를 결정할 때 좀 더 자유주의가 필요하다고 생각한다. – James

관련 문제