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

3

我正在尝试在我的测试框架中锁定一张表格,以触发超时。我正在使用以下代码来锁定这个表格。

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个回答

9

Oracle的文档如下所述:

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

有没有办法可以将其锁定,然后保持锁定状态直到回滚?我需要在执行其他Java命令时锁定它,并且不想在此处创建线程。 - James
好的,我想我需要更加宽容地判断一个回答是否是一个“答案”。 - James
如果每个线程都获得一个新的连接对象并与数据库交互,那么这是否适用于多线程环境? - Pintu
由于锁是在数据库表级别上进行的,如果您有其他线程使用新连接访问,则它们必须等待表锁释放。 - Ernesto Campohermoso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接