java调用Oracle的锁表命令

     在项目应用中,在执行某些操作时不希望别人对表进行操作,这时会用到oracle中的锁表命令。下明是我写的小测试实例,帮组大家实现java中控制oracle锁表操作。

      首先创建连接数据库的方法,在提示部分打入断点,执行debus方式启动的那个。

package com.itown.item;

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

  

 

         实现另外一个类,这样才能认为是两个客户端在同时操作一张表。

package com.itown.item;

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中控制表不被其他人修改,但是一定要在合理短的时间内提交或回滚,否则会照成其他操作无法进行。

      不知道您是否明白!呵呵!

你可能感兴趣的:(java,oracle,sql,jdbc)