zoukankan      html  css  js  c++  java
  • oracle5

    oracle中事务处理
    什么是事务 
    事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml(数据操作语言:增删改,没有查询)语句要么全部成功,要么全部失败。 
    
    如:网上转账就是典型的要用事务来处理,用于保证数据的一致性。 
    dml 数据操作语言 
    
     事务和锁
    当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户应用程序修改表的结构。这里对我们的用户来来讲是非常重要的。 
    .....其它进程排序,知道1号进程完成,锁打开(锁是一个互斥对象),2号进程进入。依次进行,如果有进程级别较高的,可以插队。 
    
    
     提交事务
    当执行用commit语句可以提交事务。当执行了commit语句之后,会确认事务的变化、结束事务。删除保存点、释放锁,当使用commit语句结束事务之后,其它会话将可以查看到事务变化后的新数据。 
    保存点就是为回退做的。保存点的个数没有限制 
    
    
     回退事务 
    在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用。保存点是事务中的一点。用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行rollback时,通过指定保存点可以回退到指定的点,这里我们作图说明。 
    
     事务的几个重要操作 
    1.设置保存点 savepoint a 
    2.取消部分事务 rollback to a 
    3.取消全部事务 rollback 
    
    注意:这个回退事务,必须是没有commit提交的;如果事务提交了,那么无论你刚才做了多少个保存点,都统统没有,rollback to a会提示没有创建保存点a. 没有提交则事物的变化只是一直积累积累,只有提交了,删除保存点、释放锁,当使用commit语句结束事务之后,其它会话将可以查看到事务变化后的新数据
    如果没有手动执行commit,而是exit了,那么会自动提交 
     
    java程序中如何使用事务
    在java操作数据库时,为了保证数据的一致性,比如账户操作(1)从一个账户中减掉10$(2)在另一个账户上加入10$,我们看看如何使用事务? 
    Java代码 
    1.package com.sp;   3.import java.sql.Connection;   
    4.import java.sql.DriverManager;   
    5.import java.sql.ResultSet;   
    6.import java.sql.Statement;   8.public class TestTrans {   10.    public static void main(String[] args) {   
    11.        try {   13.            // 1.加载驱动   
    14.            Class.forName("oracle.jdbc.driver.OracleDriver");   16.            // 2.得到连接   
    17.            Connection ct = DriverManager.getConnection(   
    18.                    "jdbc:oracle:thin:@127.0.0.1:1521:orcl""scott""tiger");   20.            Statement sm = ct.createStatement();   
    21.  
    22.            // 从scott的sal中减去100   
    23.            sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");   
    24.  
    25.            int i = 7 / 0;   //抛出异常
    26.  
    27.            // 给smith的sal加上100   
    28.            sm.executeUpdate("update emp set sal=sal+100 where ename='SMITH'");   
    29.  
    30.            // 关闭打开的资源   
    31.            sm.close();   
    32.            ct.close();   
    33.        } catch (Exception e) {   
    34.            e.printStackTrace();   
    35.        }   
    36.  
    37.    }   
    38.  
    39.}  
    运行,会出现异常,查看数据库,SCOTT的sal减了100,但是SMITH的sal却不变,很可怕。。。 
    我们怎样才能保证,这两个操作要么同时成功,要么同时失败呢? 
    Java代码 
    1.package com.sp;   
    2.  
    3.import java.sql.Connection;   
    4.import java.sql.DriverManager;   
    5.import java.sql.SQLException;   
    6.import java.sql.Statement;   
    7.  
    8.public class TestTrans {   
    9.  
    10.    public static void main(String[] args) {   
    11.        Connection ct = null;   
    12.        try {   
    13.            // 1.加载驱动   
    14.            Class.forName("oracle.jdbc.driver.OracleDriver");   
    15.  
    16.            // 2.得到连接   
    17.            ct = DriverManager.getConnection(   
    18.                    "jdbc:oracle:thin:@127.0.0.1:1521:orcl""scott""tiger");   
    19.  
    20.            // 加入事务处理   
    21.            ct.setAutoCommit(false);// 设置不能默认提交   
    22.  
    23.            Statement sm = ct.createStatement();   
    24.  
    25.            // 从scott的sal中减去100   
    26.            sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");   
    27.  
    28.            int i = 7 / 0;   
    29.  
    30.            // 给smith的sal加上100   
    31.            sm.executeUpdate("update emp set sal=sal+100 where ename='SMITH'");   
    32.  
    33.            // 提交事务   
    34.            ct.commit();   
    35.  
    36.            // 关闭打开的资源   
    37.            sm.close();   
    38.            ct.close();   
    39.        } catch (Exception e) {   
    40.            // 如果发生异常,就回滚   
    41.            try {   
    42.                ct.rollback();   
    43.            } catch (SQLException e1) {   
    44.                e1.printStackTrace();   
    45.            }   
    46.            e.printStackTrace();   
    47.        }   
    48.  
    49.    }   
    50.  
    51.}  
    再运行一下,会出现异常,查看数据库,数据没变化。
     只读事务 
    只读事务是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。假定机票代售点每天18点开始统计今天的销售情况,这时可以使用只读事务。在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。 
    
    设置只读事务(SQL*Plus里面输入set transaction read only,这后面的查询只是之前的,刚刚更新的数据查不出来)(只有commit数据才是真的提交到数据库)
    sql函数的使用 
    字符函数 
    介绍 
    字符函数是oracle中最常用的函数,我们来看看有哪些字符函数: 
     lower(char):将字符串转化为小写的格式。 
     upper(char):将字符串转化为大写的格式。 
     length(char):返回字符串的长度。 
     substr(char,m,n):取字符串的子串      n代表取n个的意思,不是代表取到第n个 
     replace(char1,search_string,replace_string) 
     instr(char1,char2,[,n[,m]])取子串在字符串的位置 
    问题:将所有员工的名字按小写的方式显示 
    SQL> select lower(ename) from emp; 
    问题:将所有员工的名字按大写的方式显示。 
    SQL> select upper(ename) from emp; 
    问题:显示正好为5个字符的员工的姓名。 
    SQL> select * from emp where length(ename)=5; 
    问题:显示所有员工姓名的前三个字符。 
    SQL> select substr(ename,1,3) from emp; 
    问题:以首字母大写,后面小写的方式显示所有员工的姓名。 
    SQL> select upper(substr(ename,1,1)) || lower(substr(ename,2,length(ename)-1))  from emp; 
    问题:以首字母小写,后面大写的方式显示所有员工的姓名。 
    SQL> select lower(substr(ename,1,1)) || upper(substr(ename,2,length(ename)-1))  from emp; 
    问题:显示所有员工的姓名,用“我是老虎”替换所有“A” 
    SQL> select replace(ename,'A', '我是老虎') from emp; 
    数学函数 介绍 
    数学函数的输入参数和返回值的数据类型都是数字类型的。数学函数包括cos,cosh,exp,ln, log,sin,sinh,sqrt,tan,tanh,acos,asin,atan,round,我们讲最常用的: 
     round(n,[m]) 该函数用于执行四舍五入,如果省掉m,则四舍五入到整数,如果m是正数,则四舍五入到小数点的m位后。如果m是负数,则四舍五入到小数点的m位前。 
     trunc(n,[m]) 该函数用于截取数字。如果省掉m,就截去小数部分,如果m是正数就截取到小数点的m位后,如果m是负数,则截取到小数点的前m位。 
     mod(m,n) 
     floor(n) 返回小于或是等于n的最大整数 
     ceil(n) 返回大于或是等于n的最小整数 
    对数字的处理,在财务系统或银行系统中用的最多,不同的处理方法,对财务报表有不同的结果。 
    
    问题:显示在一个月为30天的情况下,所有员工的日薪金,忽略余数。 
    SQL> select trunc(sal/30), ename from emp; 
    or 
    SQL> select floor(sal/30), ename from emp; 
    
    在做oracle测试的时候,可以使用dual表 
    select mod(10,2) from dual;结果是0 
    select mod(10,3) from dual;结果是1 
    
    
    其它的数学函数,有兴趣的同学可以自己去看看: 
    abs(n): 返回数字n的绝对值 
    select abs(-13) from dual; 
    acos(n): 返回数字的反余弦值 
    asin(n): 返回数字的反正弦值 
    atan(n): 返回数字的反正切值 
    cos(n): 
    exp(n): 返回e的n次幂 
    log(m,n): 返回对数值 
    power(m,n):    返回m的n次幂 
    日期函数 
    介绍 
    日期函数用于处理date类型的数据。 
    默认情况下日期格式是dd-mon-yy 即12-7月-78 
    (1)sysdate: 该函数返回系统时间 (年月日)
    (2)add_months(d,n) 加月份
    (3)last_day(d):返回指定日期所在月份的最后一天 
    问题:查找已经入职8个月多的员工 
    SQL> select * from emp where sysdate>=add_months(hiredate,8); 
    问题:显示满10年服务年限的员工的姓名和受雇日期。 
    SQL> select ename, hiredate from emp where sysdate>=add_months(hiredate,12*10); 
    问题:对于每个员工,显示其加入公司的天数。 
    SQL> select floor(sysdate-hiredate) "入职天数",ename from emp; 
    or 
    SQL> select trunc(sysdate-hiredate) "入职天数",ename from emp; 
    问题:找出各月倒数第3天受雇的所有员工。 
    SQL> select hiredate,ename from emp where last_day(hiredate)-2=hiredate;
  • 相关阅读:
    day25:接口类和抽象类
    vue1
    How the weather influences your mood?
    机器学习实验方法与原理
    How human activities damage the environment
    Slow food
    Brief Introduction to Esports
    Massive open online course (MOOC)
    Online learning in higher education
    Tensorflow Dataset API
  • 原文地址:https://www.cnblogs.com/yaowen/p/4855727.html
Copyright © 2011-2022 走看看