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

相关问题