2011-12-20 98 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

的甲骨文的文檔說:

您可以使用LOCK TABLE語句來鎖定在 指定的鎖定模式整個數據庫表,這樣就可以共享或拒絕與他們接觸行 共享鎖允許併發訪問表;他們阻止其他 用戶鎖定整個表格以供專用。當您的事務發出提交或回滾時,表鎖定爲 。

因此,您需要啓動一個事務並對其進行維護。下面的代碼維護表鎖定了一分鐘:

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 2011-12-20 03:50:30

+0

足夠公平,我想我需要更自由,當確定答案是'答案' – James 2011-12-20 04:10:04

相關問題