使用JDBC驱动程序在oracle数据库中锁定表

时间:2011-12-20 03:25:57

标签: java jdbc

我试图在我的测试框架中锁定一个表以触发超时。我使用以下代码来锁定表。

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中测试这个,一旦我执行了那个锁,我在手动测试页面时正在睡眠线程,这会导致问题吗?

谢谢, 詹姆斯

1 个答案:

答案 0 :(得分:9)

oracle的文档说:

  

使用LOCK TABLE语句锁定a中的整个数据库表   指定锁定模式,以便您可以共享或拒绝访问它们。行   共享锁允许并发访问表;他们阻止其他   用户锁定整个表以供独占使用。表锁是   在事务发出提交或回滚时发布。

所以你需要启动一个事务并维护它。以下代码将表锁定一分钟:

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();
}