oracle学习笔记(2)

1、事务处理
   1)事务和锁
          当执行事务操作时(dml语句),oracle 会在被作用的表上加锁,防止其他用户改表的结构,只有当一个事务执行完了
      锁解开了,其他用户才可以对这个表进行操作,这对于用户来说十分重要,避免同时操作同一个表。
   2)回退事务
          保存点(savepoint)是事务中的一点,用于取消部分事务,当结束事务后,会自动的删除该事务所定义的所有保存点。
      当执行rollback时,通过指定保存点可以回退到指定的点,这对于操作人员来说作用十分大,因为当数据出错时,可以采用
      回退事务,恢复到指定的状态。
          设置保存点: savepoint a1; 回滚到指定的保存点:rollback to a1;  取消所有事务:rollback
   3) 提交事务
          当执行commit语句可以提交事务,当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁,
      当使用commit语句结束事务之后,其他会话将可以查看到事务变化后的新数据。
   4) 只读事务
          当只读事务开启后,查看的数据将不再显示后来更新的数据。这种事务在进行数据统计时最常用,这样可以避免统计期间,
      后来更新的数据对统计结果的干扰。
          设置只读事务:set transaction read only

2、java操作数据库

    1)采用jdbc_odbc桥接方式,这个采用的是系统内置的驱动,不需要另外导入驱动包。

         装载驱动类:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

         连接url:  jdbc:odbc:DStest,其中DSTest为自己在本地配置的数据源。

         创建数据源方法如下:

         (1) 打开控制面版,选择管理工具

           
              oracle学习笔记(2)

         (2)选择数据源

                  
               oracle学习笔记(2)

         (3)选择添加按钮

               
            oracle学习笔记(2)

      (4)在安装oracle的时候,系统自动注册了oracle数据源,点击oracle in OraHome92
            oracle学习笔记(2)

 

      (5)Data Source Name:随便取一个,Description:可以不填,TNS Service Name :点击下拉框,

           选择安装数据库时,创建的数据库实例。

           信息填完后,可以点击Test Connection 按钮测试是否链接成功。

           
          oracle学习笔记(2)
      (6)java操作代码

         

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class test {
	public static void main(String[] args) {
         try{
        	 
        	 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        	 Connection conn=DriverManager.getConnection("jdbc:odbc:DStest","scott","netjava");
        	 Statement st=conn.createStatement();
        	 ResultSet set=st.executeQuery("select * from emp");
        	 while(set.next()){
        		 System.out.println("用户名:"+set.getString("ename"));	 
        	 }
         }catch (Exception e) {
        	 e.printStackTrace();
         }
	}
}

     (7) 执行结果

       
      oracle学习笔记(2)

 

 

   2)采用jdbc方式,这个需要导入oracle驱动包。

        驱动类:Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

        连接url:  jdbc:oracle:thin:@localhost:1521:oracle

       

   3)举例说明使用事务的必要性,比如在银行的转账系统中,从一个用户的余额中减去1000元,在另外一个用户增加

        1000员,如果执行减法的语句执行成功,而执行加法的语句没有成功的话,那么意味着用户的钱凭空消失了,或者

        反过来,那么银行就亏大了,这样的事情在现实生活中肯定是不可以让他发生的。要解决这样的问题,那么就得用到

        事务处理机制,开启事务后,所有的sql语句,要么全部成功,要么全部失败。

   4)采用jdbc来执行事务处理实现

        java代码:

       

package com.champion.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * 连接oracle操作
 * 
 * @author: 通信0905--沈冠军
 * @time: 2011-5-7
 */
public class Conn2Oracle {

	public static void main(String[] args) {
		try {
			// 创建驱动
			Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
			// 用户名和密码
			String userName = "scott";
			String password = "netjava";
			// 数据库连接url
			String url = "jdbc:oracle:thin:@127.0.0.1:1521:oracle";
			// 取得连接
			Connection conn = DriverManager.getConnection(url, userName,
					password);
			// (1)设置自动提交为false,默认的为没执行一句sql,就提交一次
			conn.setAutoCommit(false);
			// 创建预编译对象
			Statement smt = conn.createStatement();
			// (2) 将SCOTT职工的工资减去100元;
			smt.executeUpdate("update emp set sal=sal+100 where ename='SCOTT'");
			// (3)制造一个异常
			int i = 10 / 0;
			// (4)给SMITH职工的工作添加100元
			smt.executeUpdate("update emp set sal=sal-100 where ename='SMITH'");
			// 查询工资
			ResultSet set = smt
					.executeQuery("select ename , sal from emp where ename='SCOTT' or ename='SMITH'");
			//(5)提交事务
			conn.commit();
			while (set.next()) {
				System.out.println("姓名:" + set.getString("ename") + "   工资:"
						+ set.getInt("sal"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

      说明:当注释掉(1)(2)(3)(4)(5),即只执行查询语句,查看职工的未修改前的工资,执行结果如下:

      
      oracle学习笔记(2)
 

             当注释掉 (1)(3)(5),即不执行事务处理,也没有异常,只执行SMITH的工资减少100,SCOTT的工资

             添加100,  则执行的结果如下:
            oracle学习笔记(2)
 

            当注释掉(1)(5),即不开启事务处理,在两个更新语句之间有一个语句出现异常,执行后抛出异常,

            再注释掉(1)(3)(5) , 执行结果如下:

           
             oracle学习笔记(2)
          可以看到,由于在两个更新语句之间有个i=10/0的异常抛出,在增加的语句执行成功后,执行i=10/0时,抛出

          异常,程序结束,后面的减少语句执行失败,最终导致了这样的结果。

            

          当全部不注释,即开启事务,程序也有异常,执行的时候抛出异常,再次注释掉(1)(2)(3)(4)(5)

          即只执行查询操作,执行结果如下:

            
          oracle学习笔记(2)
          可以看到,虽然在执行过程出现了异常,但是两个职工的工资都不变,也就是两个更新语句都执行失败,

           这就是事务的作用,由于第二个语句失败,所以全部语句都失败。

3、总节一下

           用java执行oracle数据库和用java执行mysql数据唯一的区别就是连接url和所用的驱动类不同,同样的,java

     操作其他数据库的原理一样,以前都没有用过事务,对事务的了解不是很多,通过这次的学习,对事务机制有了一的

     了解,也知道哪些场合应该使用事务处理,哪些场合不用,最后的就是没有用过jdbc_odbc来操作,因为这个要置数

     据源,在以前使用的mysql中,没有见过这种类型,所以,知识是很广泛的,只有多看多用多学,才可以拓宽自己视

     野。

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据结构,oracle,sql,mysql,jdbc)