原子性

事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。

-- 创建表
create table account_money
(
id number(4) not null,
name varchar2(4) not null,
money number(5,2) not null
)
;
-- 增加一个检查约束
alter table account_money
add constraint CK_money
check (money>=0);

--向张三这个账号增加数据
insert into ACCOUNT_MONEY (ID, NAME, MONEY)
values (1001, '张三', 500.00);
insert into ACCOUNT_MONEY (ID, NAME, MONEY)
values (1002, '张三', 1.00);

增加后的表如下:

ID    NAME    MONEY
1    1001    张三    500.00   
2    1002    张三    1.00

以下为oracle事务处理

BEGIN
--从张三的1001账户转入张三的1002账户
UPDATE account_money a SET a.Money=a.Money-600 WHERE a.Id='1001';
UPDATE account_money a SET a.Money=a.Money+600 WHERE a.Id='1002';
COMMIT;--提交事务
EXCEPTION --异常处理
WHEN OTHERS THEN ROLLBACK;--出现异常就回滚
Dbms_Output.Put_Line('转账异常,转账失败');

在上述代码中,因为账户设置了检查约束,当账户小于0时,就会出现异常,如果不进行事务异常处理,那么第二条更新语句会被执行。当做了事务异常处理后,当出现异常就会回滚。

一致性

在事务操作前后,数据必须处于一致状态。是一个业务规则约束的范畴。

同样使用以上的表来做以说明:

DECLARE
account_a account_money.Money%TYPE;
account_b account_money.Money%TYPE;
BEGIN
SELECT a.money INTO account_a FROM account_money a WHERE a.Id='1001';
SELECT a.money INTO account_b FROM account_money a WHERE a.Id='1002';
Dbms_Output.Put_Line('转账前A账户余额:'||account_a);
Dbms_Output.Put_Line('转账前B账户余额:'||account_b);
Dbms_Output.Put_Line('转账前总余额:'||(account_a+account_b));
UPDATE account_money SET money=money-100 WHERE ID='1001';
UPDATE account_money SET money=money+100 WHERE ID='1002';
COMMIT;
SELECT a.money INTO account_a FROM account_money a WHERE a.Id='1001';
SELECT a.money INTO account_b FROM account_money a WHERE a.Id='1002';
Dbms_Output.Put_Line('转账后A账户余额:'||account_a);
Dbms_Output.Put_Line('转账后B账户余额:'||account_b);
Dbms_Output.Put_Line('转账后总余额:'||(account_a+account_b));
EXCEPTION
WHEN OTHERS THEN
Dbms_Output.Put_Line('转账失败,业务取消');
SELECT a.money INTO account_a FROM account_money a WHERE a.Id='1001';
SELECT a.money INTO account_b FROM account_money a WHERE a.Id='1002';
Dbms_Output.Put_Line('停止转账后A账户余额:'||account_a);
Dbms_Output.Put_Line('停止转账后B账户余额:'||account_b);
Dbms_Output.Put_Line('停止转账后总余额:'||(account_a+account_b));
END;

执行上段代码,

执行第一遍:

转账前A账户余额:500
转账前B账户余额:1
转账前总余额:501
转账后A账户余额:400
转账后B账户余额:101
转账后总余额:501

执行第二遍:

转账前A账户余额:400
转账前B账户余额:101
转账前总余额:501
转账后A账户余额:300
转账后B账户余额:201
转账后总余额:501

执行第三遍:

转账前A账户余额:300
转账前B账户余额:201
转账前总余额:501
转账后A账户余额:200
转账后B账户余额:301
转账后总余额:501

。。。。。。

当执行第5遍时:A账户的余额为0,如果再执行会出现象呢?

转账前A账户余额:100
转账前B账户余额:401
转账前总余额:501
转账后A账户余额:0
转账后B账户余额:501
转账后总余额:501

执行第6遍,第7遍…………:

转账前A账户余额:0
转账前B账户余额:501
转账前总余额:501
转账失败,业务取消
停止转账后A账户余额:0
停止转账后B账户余额:501
停止转账后总余额:501

我们会发现,当我们做事务处理后,总额不会发生变化,当出现异常就不会再执行(或者说回滚)!

隔离性

对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不是以任何方式依赖于或影响其它事务。

每个事务是独立的,我们在PL/SQL中新建两个SQL窗口就以可以做两个事务处理。

我们还是使用以上表,表内容如下:

ID    NAME    MONEY
1    1001    张三    0.00
2    1002    张三    501.00

第一个SQL窗口:

第二个SQL窗口:

输入:SELECT * FROM account_money;这条查询语句,我们会发现,第一个SQL窗口没有执行之前的数据。

如果我们也在第二个SQL窗口使用update更新数据会怎么样呢?

UPDATE account_money SET money=money+300 WHERE ID='1001';
SELECT * FROM account_money;

他会等待第一个SQL窗口提交事务才会有更新结果!

这时我们提交第一个SQL窗口的事务,我们会看到,两个窗口的结果都发生变化。

我们再提交第二个SQL窗口的事务(在第一个SQL窗口事务没有提交之前是不能提交第二个窗口的事务的),结果也同上图!

持久性

事务完成后,它对数据库的修改被永久保存下来。

oracle事务特性详解的更多相关文章

  1. (转)Spring事务管理详解

    背景:之前一直在学习数据库中的相关事务,而忽略了spring中的事务配置,在阿里面试时候基本是惨败,这里做一个总结. 可能是最漂亮的Spring事务管理详解 https://github.com/Sn ...

  2. 可能是最漂亮的Spring事务管理详解

    Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么 ...

  3. 可能是最漂亮的Spring事务管理详解 专题

    微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允 ...

  4. 最漂亮的Spring事务管理详解

    SnailClimb 2018年05月21日阅读 7245 可能是最漂亮的Spring事务管理详解 Java面试通关手册(Java学习指南):github.com/Snailclimb/- 微信阅读地 ...

  5. oracle表分区详解

    原文来自:http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html oracle表分区详解 从以下几个方面来整理关于分区表的概念及 ...

  6. Oracle权限管理详解

    Oracle权限管理详解 转载--CzmMiao的博客生活 Oracle 权限 权限允许用户访问属于其它用户的对象或执行程序,ORACLE系统提供三种权限:Object 对象级.System 系统级. ...

  7. Java从入门到精通——数据库篇Oracle 11g服务详解

    装上Oracle之后大家都会感觉到我们的电脑慢了下来,如何提高计算机的速度呢?我们应该打开必要的服务,关闭没有用的服务.下面是Oracle服务的详解: Oracle ORCL VSS Writer S ...

  8. oracle rac IP详解

    rac环境下vip/public/private IP的区别 每个节点要2块网卡, 3个IP,虚拟IP或者叫做业务IP,单个网卡当掉可以“漂”到其他网卡是继续提供服务 在Oracle RAC环境下,每 ...

  9. Oracle AWR 报告详解

    转自:http://blog.csdn.net/laoshangxyc/article/details/8615187 持续更新中... Oracle awr报告详解 DB Name DB Id In ...

随机推荐

  1. zip file 压缩文件

    有时候我们希望 upload 文件后自动压缩, 可以节省空间. 可以使用微软提供的压缩代码 Install-Package System.IO.Compression.ZipFile -Version ...

  2. Ombrophobic Bovines

    poj2391:http://poj.org/problem?id=2391 题意:一个人有n个农场,每个农场都一个避雨的地方,每个农场有一些牛,每个避雨的地方能容纳牛的数量是有限的.农场之间有一些道 ...

  3. linux 发布 qt(更新ld命令的路径依赖)

    PATH 错误解决error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such ...

  4. windows7+iis7+php的配置

    最近在找工作,人被逼了,所以没事就学习php了.以下是开发环境的搭建: 环境搭建 然后就是解析php脚本的两种配置方法: fastCgiModule与ISAPI方式 两种配置方法 本文为转载...

  5. ReiserFS与EXT3的比较

    ReiserFS与EXT3的比较 最近,我刚从ReiserFS文件系统转到了ext3日志文件系统.我是一个ReiserFS的忠实追随者,并且直到现在我也没有改变我对该文件系统的看法.我之所以转而使用e ...

  6. PHP实现登录,注册,密码修改

    注册,登录,修改密码 1.登录 2.忘记密码 3.免费注册 页面布局 <div id="views" class="views"> <div ...

  7. 部署ASP.Net项目 遇到总是启用目录浏览或者报HTTP 错误 403.14 - Forbidden 的原因

    部署Asp.Net 网站总是报下面的问题 原因: 没有为网站指定默认文档,增加默认文档 1.选中“默认文档” 2.点击右边“打开功能” 点击右边“添加”按钮,把你想作为的默认页面添加就可以了,重启服务 ...

  8. Android实现OCR扫描识别数字图片之图片扫描识别

    [Android实例] Android实现OCR扫描识别数字图片之图片扫描识别 Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料. 可以吧 ...

  9. 使用Vagrant machine

    使用Vagrant 查看Vagrant状态 vagrant status SSH vagrant ssh 共享文件 在vagrantfile中添加共享文件配置 Vagrant.configure(2) ...

  10. HDU1510 White rectangles

    White Rectangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...