在项目应用中,在执行某些操作时不希望别人对表进行操作,这时会用到oracle中的锁表命令。下明是我写的小测试实例,帮组大家实现java中控制oracle锁表操作。
首先创建连接数据库的方法,在提示部分打入断点,执行debus方式启动的那个。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class ConnectOracle {
/** Oracle数据库连接URL */
private final static String DB_URL = "jdbc:oracle:thin:@localhost:1521:demo"; /** Oracle数据库连接驱动 */
private final static String DB_DRIVER = "oracle.jdbc.driver.OracleDriver"; /** 数据库用户名 */
private final static String DB_USERNAME = "hniqp"; /** 数据库密码 */
private final static String DB_PASSWORD = "hniqp"; /** * 获取数据库连接 * * @return */
public Connection getConnection() {
/** 声明Connection连接对象 */
Connection conn = null;
try {
/** 使用Class.forName()方法自动创建这个驱动程序的实例且自动调用DriverManager来注册它 */
Class.forName(DB_DRIVER);
/** 通过DriverManager的getConnection()方法获取数据库连接 */
conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
} catch (Exception ex) { ex.printStackTrace(); }
return conn;
}
/** * 关闭数据库连接 * * @param connect */
public void closeConnection(Connection conn) {
try {
if (conn != null) {
/** 判断当前连接连接对象如果没有被关闭就调用关闭方法 */
if (!conn.isClosed()) {
conn.close();
}
}
} catch (Exception ex) { ex.printStackTrace(); }
}
public static void main(String[] args) throws SQLException {
ConnectOracle con = new ConnectOracle();
Connection connect = con.getConnection();
//设置手动提交事务
connect.setAutoCommit(false);
Statement stmt = connect.createStatement();
//锁表
stmt.addBatch("lock table t_symbol_code_fee in exclusive mode");
//此处打上断点后,执行另一个类,你会发现,执行成功后并没有更改记录,因为表已经被锁定。只有提交事务后,TestOracle中执行的修改才能生效。
stmt.executeBatch();
//提交后自动解锁,回滚时也会自动解锁
connect.commit();
stmt.close();
connect.close();
}
}
实现另外一个类,这样才能认为是两个客户端在同时操作一张表。
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class TestOracle {
public static void main(String[] args) throws SQLException {
ConnectOracle con = new ConnectOracle();
Connection connect = con.getConnection();
Statement stmt = connect.createStatement();
stmt.executeQuery("update t_symbol_code_fee fee set fee.unit = 2");
stmt.close();
connect.close();
}
}
执行之后会发现,更新并没有执行,而且也没有报错。这是因为第一个类已经锁住了表,而且还没有提交或回滚,这时其他客户端只能查询该表,不能对该表进行其他操作。当我们把ConnectOracle 类执行到过commit后,你会发现数据库中的记录这时被更改了。
综上所诉,我们可以在java中控制表不被其他人修改,但是一定要在合理短的时间内提交或回滚,否则会照成其他操作无法进行。