Orcale 事务

银行的转账业务(a转钱给b),原理上是修改表中的余额字段

Step1:从a 的余额中减掉响应的金额

Step2:给b的余额加上响应的金额

如果Step1和step2之间发生了异常 比如断电 ,地震等不可逆现象将会导致A的钱被扣了但是B的钱没有增加

这样显然不行

人们就会想一种办法 让Step1 和Step2 同时成功或者同时失败

这就产生了事务

事务具有原子性不可分割性 要么成功要么失败 不可能一件事情成功了 另一件事情失败了

那么在java中如何将2条或者2条以上的 dml 语句组合成一个事物呢?

(所谓dml语句既 插入,修改,删除 数据)

1:将自动提交关闭 (oracle默认的是自动提交事务)

Connection里面的 setAutoCommit(false) 设为false

2:写dml语句

3:抓异常 

4:在异常里面回滚事物

Connection rollback();

代码如下:

try {

//加载驱动

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException e2) {

e2.printStackTrace();

}

Connection conn=null;

try {

//获得连接

conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");;

//设置不自动提交事物

conn.setAutoCommit(false);

//dm1语句1

PreparedStatement ps=conn.prepareStatement("update emp set sal=sal-1000 where  ename=‘KING‘");

ps.executeUpdate();

//dm1语句2

PreparedStatement ps2=conn.prepareStatement("update emp set sal=sal+1000 where  ename=‘SMITH‘");

ps2.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

try {

//回滚事物

conn.rollback();

} catch (SQLException e1) {

e1.printStackTrace();

}

}catch(Exception e){

}

注意 事务 只能在同一链接中。

时间: 2024-10-23 19:49:07

Orcale 事务的相关文章

查看Orcale数据里的表是否有变化

由于我们公司一个数据库两个应用在使用,导致一个应用修改了数据库,另一个应用用的缓存而不知道有更新还是原来的结果.原来的处理方式是采用session缓存的方式,用户登出了就清空缓存,这样只需要重新登录一次就得到最新的快照放在缓存中了,但现在新的要求是不登出就要实时刷新改了的内容.其实这种方式最好的处理办法是一个应用改了数据库通知另一个应用去刷新缓存,但是线下应用用vb写的成熟的产品,都是一帮老员工很难让他们去改点东西来适合新应用,都是新应用去套他们的.领导本来说直接不用缓存了,每次去读数据库,我觉

微服务分布式事务的一些思考

关于微服务分布式事务的一些思考,笔者没有参与过复杂分布式事务的场景,各位大神路过可以分享一些遇到的案例,大家一起探讨. 关于分布式事务,笔者推荐的处理方法是"尽量避免",如果实在避免不了(这已经是高并发.用户量比较多的网站了)则使用"最终一致性"处理(参照CAP理论base思想),如果处理了事务,但还是遇到了数据错误,那还有最后一道保障,那就是"日志",可以通过日志找回数据,其实大部分互联网公司也都是这么做的.说到"尽量避免"

SQL 约束,事务,触发器,存储引擎,多表查询

SQL约束 SQL约束主要有以下几种: NOT NULL: 用于控制字段的内容一定不能为空(NULL). UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束. PRIMARY KEY:也是用于控件字段内容不能重复,但它在一个表只允许出现一个. FOREIGN KEY: FOREIGN KEY 约束用于预防破坏表之间连接的动作,FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一. CHECK: 用于控制字段的值范围. DEFAULT

关于mysql事务行锁for update实现写锁的功能

 例子1: 在电子商务里,经常会出现库存数量少,购买的人又特别多,大并发情况下如何确保商品数量不会被多次购买. 其实很简单,利用事务+for update就可以解决. (for update仅仅适用于InnoDB) 我们都知道for update实际上是共享锁,是可以被读取的.但是如何在执行时,不被读取呢. 简单来说:假设现在库存为1,现在有A和B同时购买 先开启一个事务 begin; select stock from good where id=1 for update;//查询good表某

orcale 11g安装,创建表空间,用户,授权用户

一.卸载旧oracle 用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢?那就是直接注册表清除,步骤如下: 1. 开始->设置->控制面板->管理工具->服务     停止所有Oracle服务. 2. 开始->程序->Oracle - OraDb11g_home1->Oracle安装产品-> Universal Installer     卸装所有Oracle产品,但Universal I

初识事务,事务隔离级别,事务传播行为

本篇文章会介绍以下几个概念:事务,事务隔离级别,spring事务的传播模式.在介绍事务时会引出原子性的概念,在介绍事务隔离级别的时候会引出脏读和幻读的概念. 事务 什么是事务? 事务最开始是数据库中的概念,它把一系列的操作统一为一个整体,这一系列的操作要么同时成功,要么同时失败.一个事务基本的操作是: 开启事务 如果发生了错误,进行回滚 如果没有发生错误,则提交事务 为什么要有事务? 在我们处理简单业务的时候,比如说一条插入数据的操作,只会得到两个结果,要么插入成功,要么插入失败,这对应到代码逻

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

MySQL的事务与事务隔离

MySQL中自从引入InnoDB引擎后,在MySQL中就支持事务,事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元,平时通过提交工作单元来完成在事务中的相应的查询或修改,在能支持事务的数据库中必须要满足ACID测试,即事务的四个特性: A:Atomicity,原子性(都执行或者都不执行) C:Consistency,一致性(从一个一致性状态转到另外一个一致性状态) I:Isolaction,隔离性(一个事务的所有修改操作在提交前对其他事务时不可见的) D: Durability

(十五)PL/SQL事务

数据库事务是一个工作的原子单元,其可以由一个或多个相关的SQL语句组成.所谓的原子性就是数据库的修改所带来的构成事务的SQL语句可以集体被提交,即永久到数据库或从数据库中(撤消)回滚.一个成功执行的SQL语句和提交的事务不一样.即使一个SQL语句执行成功,除非包含该语句的事务被提交,但也可以回滚和声明(S)的所有更改可以撤消. 一.开始事务事务都有开始和结束.事务开始时有下列事件之一:  连接到数据库后执行的第一个SQL语句.  在事务完成之后发出每一个新的SQL语句完成. 二.提交事务事务是通