二、事务和锁

当执行事务操作时(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$,我们看看如何使用事务?

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", "scott");

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 却不变,很可怕。。。我们怎样才能保证,这两个操作要么同时成功,要么同时失败呢?

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", "scott");

// 加入事务处理

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>

java的oracle事务回滚_Oracle事务处理相关推荐

  1. java pg数据库事务回滚,基于Postgresql 事务的提交与回滚解析

    用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行 ...

  2. java中的事务回滚_Spring中的事务回滚机制

    问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一.特性 先了解一下@Transaction ...

  3. Java的@Transactional事务回滚

    @Transactional 基本原理概述 在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@ ...

  4. java pg数据库事务回滚_PG 事务提交与回滚

    在PostgreSQL中,如果执行一个dml或ddl语句,默认一执行完就马上提交了,不能回滚,这样容易导致误操作的发生,避免这个风险的办法是关闭自动提交 1 设置\set AUTOCOMMIT off ...

  5. java pg数据库事务回滚_PostgreSQL事务特性之ROLLBACK

    一.回滚DDL 1. 回滚表的创建 postgres=# begin; BEGIN postgres=# create table test (id int, name text); CREATE T ...

  6. php try 并回滚,ThinkPHP异常处理、事务处理(事务回滚)

    本篇文章给大家介绍,ThinkPHP异常处理.事务处理(事务回滚),用购买下订单减库存的案例分析,希望对大家在工作和学习中有所帮助. 1.Mysql建表引擎使用InnoDB,支持事务回滚. 2.代码案 ...

  7. java 单元测试_在springboot中写单元测试解决依赖注入和执行后事务回滚问题

    往期文章 「Java并发编程」谈谈Java中的内存模型JMM 面试官:说说你知道多少种线程池拒绝策略 为什么不要在MySQL中使用UTF-8编码方式 前言 很多公司都有写单元测试的硬性要求,在提交代码 ...

  8. java 事务 回滚

    给java后台方法添加事务回滚注解,在方法进行多表的增删改查的时候,如果失败可以对此方法前面的一些更新数据库表的语句进行撤销(回滚) 注解:@Transactional(rollbackFor = E ...

  9. java rollback_Java Connection.rollback()方法:事务回滚

    Java Connection.rollback() 方法用于取消在当前事务中进行的更改,并释放当前 Connection 对象持有的所有数据库锁.此方法只有在手动事务模式下才可用. 语法1 roll ...

最新文章

  1. Htaccess文件是什么以及Windows下自由创建.htaccess文件的N种方法
  2. java几个easy出错的小程序
  3. 细数英特尔收购McAfee可获得安全产品
  4. CodeForces - 1395D Boboniu Chats with Du(贪心)
  5. java set spliterator_Java HashSet spliterator() 方法
  6. 【2021.02.09更新】数字信号处理公式推导
  7. 学习web标准、用户体验改善、Ajaxamp;Asp.Net
  8. 推荐系统之协同过滤算法分布式实现(附代码实现)
  9. Ansible条件测试
  10. JedisConnectionException: Failed connecting to host localhost:6379
  11. 教育机构:用数字化赋能教育
  12. html 展开 折叠,HTML实现点击展开和收起
  13. 中级软件设计师笔记全套 看完你就过啦
  14. SSD固态硬盘重装win10系统 无法分区,gpt格式
  15. Godaddy Backorder 失败后申请退款。
  16. 征服游戏 Floyd算法
  17. python爬携程_用python selenium抓取携程信息
  18. OSINT + Python #x3D; 自定义黑客
  19. 19年6月英语六级阅读单词
  20. Unity 解决 An asset is marked with HideFlags.DontSave but is included in the build 问题

热门文章

  1. 搞不明白为什么大家都在学习 k8s
  2. BAT警示:没试过这个方法就别说会数据分析!!
  3. 独家揭秘!抖音爆款实时视频漫画变身特效背后技术
  4. 为什么说 C++ 太复杂?有必要这么复杂吗?| 原力计划
  5. 倒计时 2 天!「2019 嵌入式智能国际大会」全日程大公开!
  6. 字节跳动入局全网搜索;思科回应中国区裁员;IntelliJ IDEA 新版发布! | 极客头条...
  7. “Hyperledger Fabric 是假区块链!”
  8. 现在的 C 语言仍值得程序员学习吗?
  9. Google 员工公开 Windows 10 零日漏洞隐藏 Bug!
  10. 人工智能是 6G 诞生的关键!| 极客头条