我试图在我的测试框架中锁定一个表以触发超时。我使用以下代码来锁定表。
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中测试这个,一旦我执行了那个锁,我在手动测试页面时正在睡眠线程,这会导致问题吗?
谢谢, 詹姆斯
答案 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();
}