九、oracle 事务

一、什么是事务
事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml(数据操作语言,增删改,没有查询)语句要么全部成功,要么全部失败。
如:网上转账就是典型的要用事务来处理,用于保证数据的一致性。

二、事务和锁
当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户修改表的结构。这里对我们的用户来讲是非常重要的。

三、提交事务
当用commit语句执行时可以提交事务。当执行了commit语句之后,会确认事务的变化、结束事务。删除保存点、释放锁,当使用commit语句结束事务之后,其它会话将可以查看到事务变化后的新数据。保存点就是为回滚做的。保存点的个数没有限制。

四、回滚事务
在介绍回滚事务前,我们先介绍一下保存点(savepoint)的概念和作用。保存点是事务中的一点。用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行rollback 时,通过指定保存点可以回退到指定的点,这里我们作图说明。

五、事务的几个重要操作
1.设置保存点 savepoint a
2.取消部分事务 rollback to a
3.取消全部事务 rollback
eg、
SQL> savepoint a; --创建保存点a
Savepoint created
                   
SQL> delete from emp where empno=7782;
1 row deleted
                
SQL> savepoint b; --创建保存到b
Savepoint created
                
SQL> delete from emp where empno=7934;
1 row deleted
                   
SQL> select * from emp where empno=7934; --无法查询到empno为7934这条记录,因为这条记录已被删除
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
                
SQL> rollback to b; --通过保持点来恢复这条记录
Rollback complete
                   
SQL> select * from emp where empno=7934; 
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
               
SQL> select * from emp where empno=7782; --无法查询到empno为7982这条记录,因为这条记录已被删除
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
                 
SQL> rollback to a; --通过保持点来恢复这条记录
Rollback complete
               
SQL> select * from emp where empno=7782;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
                
SQL> 
注意:这个回滚事务,必须是没有commit前使用的;如果事务提交了,那么无论你刚才做了多少个保存点,都统统没用。如果没有手动执行commit,而是exit了,那么会自动提交。
eg、
SQL> savepoint a;
Savepoint created
                
SQL> delete from emp where empno=7782;
1 row deleted
            
SQL> commit;
Commit complete
        
SQL> rollback to a;
rollback to a
ORA-01086: 从未创建保存点 ‘A‘
SQL>

六、java程序中如何使用事务
在java操作数据库时,为了保证数据的一致性,比如账户操作(1)从一个账户中减掉10$(2)在另一个账户上加入10$,我们看看如何使用事务?

java代码

package junit.test;

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

public class TransationTest {

    public static void main(String[] args) {

        Connection conn = null;        try {            // 1.加载驱动            Class.forName("oracle.jdbc.driver.OracleDriver");            // 2.得到连接            conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "oracle");            Statement sm = conn.createStatement();            // 从scott的sal中减去100            sm.executeUpdate("update emp set sal=sal-100 where ename=‘SCOTT‘");            int i = 7 / 0; //报java.lang.ArithmeticException: / by zero异常            // 给smith的sal加上100            sm.executeUpdate("update emp set sal=sal+100 where ename=‘SMITH‘");            // 关闭打开的资源            sm.close();            conn.close();        } catch (Exception e) {            // 如果发生异常,就回滚            try {                conn.rollback();            } catch (SQLException e1) {                e1.printStackTrace();            }            e.printStackTrace();        }

    }

}

运行,会出现异常,查看数据库,SCOTT 的sal 减了100,但是SMITH 的sal 却不变,很可怕。。。
我们怎样才能保证,这两个操作要么同时成功,要么同时失败呢?

Java 代码

package junit.test;

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

public class TransationTest {

    public static void main(String[] args) {

        Connection conn = null;        try {            // 1.加载驱动            Class.forName("oracle.jdbc.driver.OracleDriver");            // 2.得到连接            conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "oracle");            // 加入事务处理            conn.setAutoCommit(false);// 设置不能默认提交            Statement sm = conn.createStatement();            // 从scott的sal中减去100            sm.executeUpdate("update emp set sal=sal-100 where ename=‘SCOTT‘");            int i = 7 / 0;            // 给smith的sal加上100            sm.executeUpdate("update emp set sal=sal+100 where ename=‘SMITH‘");            // 提交事务            conn.commit();            // 关闭打开的资源            sm.close();            conn.close();        } catch (Exception e) {            // 如果发生异常,就回滚            try {                conn.rollback();            } catch (SQLException e1) {                e1.printStackTrace();            }            e.printStackTrace();        }

    }

}

再运行一下,会出现异常,查看数据库,数据没变化。。

七、只读事务
只读事务是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。
假定机票代售点每天18点开始统计今天的销售情况,这时可以使用只读事务。在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
设置只读事务: set transaction read only;

比如有两个用户system、scott各自用sqlplus登陆,操作如下:
第一步:用system用户登陆sqlplus,设置只读事务。
SQL> set transaction read only;
事务处理集。
                        
第二步:用scott用户登陆sqlplus,操作如下:
SQL> select count(*) from emp; --查询emp表的总记录数
  COUNT(*)
----------
        13

SQL> insert into emp values (7777, ‘zhangsan‘, ‘MANAGER‘, 7782, to_date(‘1988-02-18‘, ‘yyyy-mm-dd‘), 38.38, 45.45, 10); --插入一条记录到emp表
1 row inserted
              
SQL> select count(*) from emp; --查询emp表的总记录数
  COUNT(*)
----------
        14
                  
SQL> commit; --提交
Commit complete

第三步:用system用户查询scott.emp表
SQL> select count(*) from scott.emp;
  COUNT(*)
----------
        13
SQL>

时间: 2024-10-10 15:47:02

九、oracle 事务的相关文章

oracle事务和锁

数据库事务概括 1. 说明 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退. 2.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数据库,执行DML.DCL.DDL语句 结束事务: 1. 执行DDL(例如CREATE TABLE),DCL(例如GRANT),系统自动执行COMMIT语句 2. 执行COMMIT/ROLLBACK 3. 退出/断开数据库的连接自动执行COMMIT语句 4. 进程意外终止,事务自动rollback 5

Oracle事务

Oracle事务的ACID特性 原子性Atomicity:事务中的所有动作要么都发生,要么都不发生. 一致性Consistency:事务将数据库从一种状态转变为下一种一致状态. 隔离性Isolation:一个事务的影响在该事务提交前对其他事务时不可见的. 持久性Durability:事务一旦提交,其影响就是永久性的. 事务控制语句 事务隐式开始 事务必须显示结束(Commit.Rollback) Commit 会结束事务,并使得已做的修改持久的保存在数据库中 Rollback 会结束事务,并撤销

Oracle 事务的開始与结束

事务是用来切割数据库活动的逻辑工作单元,事务即有起点,也有终点: 当下列事件之中的一个发生时,事务就開始了: 连接到数据库上,并运行了第一天 DML 语句: 当前一个事务结束后,又输入了另外一条 DML 语句: 当下列事件之中的一个发生时,事务就结束了: 运行 COMMIT 或 ROLLBACK语句: 运行一条 DLL语句,比如 CREATE TABLE 语句:在这样的情况下, 会自己主动运行 COMMIT 语句: 运行一条 DCL语句,比如GRANT语句:在这样的情况下,会自己主动运行COMM

Oracle 事务操作(事务的回滚与提交)

在看本文之前,请确保你已经了解了Oracle事务和锁的概念即其作用,不过不了解,请参考数据库事务的一致性和原子性浅析和Oracle TM锁和TX锁 1.提交事务 当执行使用commit语句可以提交事务.当执行了commit语句后,会确认事务的变化.结束事务.删除保存点.释放锁.在此之前,与当前事务相关的数据都会被加锁,直到当前事务进行了commit操作,如果在这个过程中有其他回话试图操作相关数据,(这些数据已经被当前事务加锁),那么其他回话会进行等待,或者直接返回错误. 注意:只有在提交事务之后

oracle事务知识点小结

DML语句流程 1 获取事务锁和ITL2 锁定候选行3 生成redo4 生成undo5 生成redo record写入log buffer并更改数据块 事务提交1 分配SCN2 更新事务表,将事务槽状态改为0x093 回收undo块4 创建commit redo record5 将redo从log buffer刷新6 释放表锁和行锁 锁一个事务由1个TX和若干TM组成,而回滚savepoint不会释放TX锁: ITL通过XID指向事务槽,进而指向undo记录,其UBA也指向undo记录:两者区别

oracle事务(转)

今天温习oracle事务,记录如下: 事务定义            事务是保持数据的一致性,它由相关的DDL或者DML语句做为载体,这组语句执行的结果要么一起成功,要么一起失败. 我们知道SQL92标准定义了数据库事务的四个特点: 原子性 (Atomicity) :一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做 一致性 (Consistency) :事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的 隔离性 (Isolation):  

Oracle事务隔离级别处理差异

Oracle事务隔离是事务读操作不同程度的数据隔离,分为READ_UNCOMMITTED.READ_COMMITTED(默认).SERIALIZABLE. Oracle事务隔离级别SERIALIZABLE,解决脏读.不重复读.幻读两个事务同时update相同记录时,第一个事务可执行,第二个事务阻塞,当第一个事务提交后,第二个事务抛出异常如图1.当第一个事务回滚后,第二个事务继续执行. 图1 Oracle事务隔离级别READ_COMMITTED,解决脏读两个事务同时update相同记录时,第一个事

Oracle事务隔离级别

oracle隔离级别 只有READ COMMITTED和 SERIALIZABLE 因为当有人对数据库的数据进行任何写操作(DML操作)时,Oracle数据库系统首先将原始的数据复制到回滚段中,之后才做相应的操作,在事务处理结束之前其他的用户可以读这些数据,但是读到的都是回滚段上的数据. 参考http://www.cnblogs.com/friends-wf/p/3746348.html Oracle事务隔离级别

Oracle事务之一:锁和隔离

Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇到下面的几种情况: 1.Commit:提交事务. 2.RollBack:回滚. 3.DDL语句:执行和提交DDL语句结果前首先提交当前所有DML语句,成为隐式提交. 4.程序正常退出:自动提交. 5.不正常的程序失败:隐式回滚. 二.事务特性 事务的四个特性:A(原子性).C(一致性).I(隔离性)

Oracle 事务的开始与结束

事务是用来分割数据库活动的逻辑工作单元,事务即有起点,也有终点: 当下列事件之一发生时,事务就开始了: 连接到数据库上,并执行了第一天 DML 语句: 当前一个事务结束后,又输入了另外一条 DML 语句: 当下列事件之一发生时,事务就结束了: 执行 COMMIT 或 ROLLBACK语句: 执行一条 DLL语句,例如 CREATE TABLE 语句:在这种情况下, 会自动执行 COMMIT 语句: 执行一条 DCL语句,例如GRANT语句:在这种情况下,会自动执行COMMIT语句: 断开与数据库