2011-12-20 14 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(); 
    } 

私はこれを実行した後、ページにアクセスして、アカウントに要素を追加しようとします。しかし、それは動作しません、ロックは発生していないようです。なぜこれがうまくいかないのでしょうか?私は現在Javaでこれをテストしています。一度ロックを実行すると、手動でページをテストしている間にスレッドをスリープ状態にしていますが、これが問題の原因になる可能性がありますか?

おかげで、 ジェームズ

答えて

7

Oracleのドキュメントは言う:

は、あなたがそれらへのアクセスを共有または拒否することができるよう 指定されたロックモードでデータベース表全体をロックする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

関連する問題