浅谈oracle事务
所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元。通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要死一起死,要活一起活。
为什么要引入事务?事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。事务结束后,能保证数据库数据的一致性。例如银行转账,一个账号扣钱,一个账号增款,要么都执行,要么都不执行,不能只执行一条,否则会出现账款错误。这样我们就可以体会到事务的重要性了吧。其实在我们的生活中,很多事情都是要组成事务来执行的。既然它那么重要,下面我们就来深入的了解一下什么是事务吧。
一.事务的四个特征ACID
事务的四个特征非常重要,只有满足这些特征,才能保证事务执行后只有一个结果:要么成功,要么失败。
(1)原子性(Atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
(2)一致性(Consistemcy):事务处理前后,数据处于一致状态,保证数据的无损。
(3)隔离性(Isolation):对数据进行修改的多个事务是彼此隔离的,互不影响。
(4)持久性(Durability):事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库。
示例一
---------创建表
CREATE TABLE bank
(
customerName CHAR(10), --顾客姓名
currentMoney number(10) --当前余额
);
---------添加余额不能小于1的约束
ALTER TABLE bank ADD CONSTRAINT CK_currentMoney CHECK(currentMoney >= 1);
---------插入测试数据
INSERT INTO bank(customerName, currentMoney) VALUES('张三', 1000);
INSERT INTO bank(customerName, currentMoney) VALUES('李四', 1);
commit;
select * from bank;
---------不使用事务完成转帐操作(总金额异常)
update bank set currentMoney=currentMoney-1000 where customerName='张三';
update bank set currentMoney=currentMoney+1000 where customerName='李四';
commit;
---------清空数据,
delete bank;
select * from bank;
---------使用事务完成转账操作不会出现总金额异常
set serveroutput on;
declare
li_money number(10):=0;
begin
update bank set currentMoney=currentMoney+1000 where customerName='李四';
select currentMoney into li_money from bank where customerName='李四';
dbms_output.put_line('李四当前的余额是:'||li_money);
update bank set currentMoney=currentMoney-1000 where customerName='张三';
exception
when others then
dbms_output.put_line('撤销提交');
rollback;
end;
--转帐之后查看结果,李四的钱被回滚回去了
select * from bank;
二.回滚到保存点
(1)rollback:回滚到最初状态,可以参考示例一。
(2)rollback to 保留点:回滚到保留点。
示例二
declare
num int;
begin
savepoint a; --创建保存点a
update bank set currentmoney=currentmoney-100 where customername='张三';
savepoint b; --创建保存点b
update bank set currentmoney=currentmoney+100 where customername='李四';
savepoint c; --创建保存点c
num:=# --从提示框接收一个数据,用于操作回滚到哪一点。
insert into bank values('王五',600);
savepoint d; --创建保存点d
if num=1 then
rollback to a; --当提示框中输入1时,回滚到保存点a,即全部回滚,相当于rollback;
elsif num=2 then
rollback to b; --当提示框中输入2时,回滚到保存点b
elsif num=3 then
rollback to c; --当提示框中输入3时,回滚到保存点c
else
rollback to d; --其他情况下,回滚到保存点d
end if;
end;
三.事务的隔离级别
从上面的示例中我们可以看到事务带给我们的巨大好处,保证了数据的一致性,但是,仅仅有保证用事务执行就可以保证数据前后是一致的吗?在实际情况下,事务是并发执行的,不可避免的会出现多个事务同一时间对相同数据的操作,这样就会产生各种并发问题。
并发问题:(1)脏读:事务T1、T2,T1读取了T2已经更改但还没有提交的数据,之后,若T2回滚,T1读到的数据就是临时无效的脏数据。
(2)不可重复读:事务T1、T2,T1读取了一个字段,然后T2更新了该字段,当T1再次读取该字段时,值就不同了。
(3)幻读:事务T1、T2,T1读取了一个字段,T2在在该表中又插入了一些字段,当T1再次读取时,会多出几行。
为了解决上面这些问题,引入了隔离级别,显然,隔离级别是指一个事务与其他事务的隔离程度,隔离级别都有哪些呢,下面简单介绍了一下。
| 隔离级别 | 描述 |
| read uncommitted(读取未提交数据) | 允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读问题都会出现。 |
| read committed(读取已提交数据) | 只允许事务读取已被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然存在。 |
| repeatable committed(可重复读) | 确保一个事务可以多次从一个字段中读取到相同的值,避免了脏读、不可重复读,但幻读问题仍然存在。 |
| serializble(串行化) | 在这个事务执行期间,禁止其他表对该表的插入、删除、修改操作,所有并发问题都可以避免,但性能低下。 |
浅谈oracle事务的更多相关文章
- 浅谈Oracle事务【转载竹沥半夏】
浅谈Oracle事务[转载竹沥半夏] 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要 ...
- 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- 浅谈oracle树状结构层级查询测试数据
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- 浅谈分布式事务与TX-LCN
最近做项目使用到了分布式事务,下面这篇文章将给大家介绍一下对分布式事务的一些见解,并讲解分布式事务处理框架TX-LCN的执行原理,初学入门,错误之处望各位不吝指正. 什么情况下需要使用分布式事务? 使 ...
- 浅谈Oracle数据库性能优化的目标
Oracle性能优化保证了Oracle数据库的健壮性,为了保证Oracle数据库运行在最佳的性能状态下,在信息系统开发之前就应该考虑数据库的优化策略.从数据库性能优化的场景来区分,可以将性能优化分为如 ...
- 浅谈Oracle数据库分区表
Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法,之前,只听过分区的大名,却总未用过,最近简单学习了一下,总结如下,不对之处,还希望朋友们多多指点,交流! 1.表空间及分区 ...
- 浅谈Oracle权限体系
对于数据库来讲,安全性的重要程度不言而喻,今天我们就来聊一聊Oracle的权限体系. 1.账户管理 在此之前,先解释下一个容易混淆的概念:模式.所谓模式,指的是用户账户所拥有的一组对象(比如表,索引, ...
- 浅谈Oracle表之间各种连接
Oracle表之间的连接分为三种: 1.内连接(自然连接) 2.外连接 2.1.左外连接(左边的表不加限制,查询出全部满足条件的结果) 2.2.右外连接(右边的表不加限制,查询出全部满足条件的结果) ...
- 浅谈Oracle中物理结构(数据文件等。。。)与逻辑结构(表空间等。。。。。)
初始Oracle时很难理解其中的物理结构和逻辑结构,不明白内存中和硬盘中文件的区别和联系,我也是初学Oracle,这里就简单的谈谈我我看法. 首先,你需要明白的一点是:数据库的物理结构是由数据库的操作 ...
随机推荐
- php实现安装程序的 安装
install.php 只要填写数据库就可以把数据插入到数据库中,实现安装 <?php header("Content-type:text/html;charset=utf-8&quo ...
- python学习网址
http://kuanghy.github.io/categories/#Python
- nginx结合tomcat一起使用
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...
- elasticsearch聚合案例--分组、求最大值再求最大值的均值
一.需求 A.B.C代表3个用户,第二列代表各自的得分,求A.B.C的最好成绩以及A.B.C最好成绩的均值 A 10 A 11 A 13 B 11 B 11 B 12 C 10 C 10 C 11 C ...
- opencv 识别答题卡
参考这个网站,然后自己 找了张图片试了一下 http://blog.csdn.net/cp562090732/article/details/47804003 // test.cpp : 定义控制台应 ...
- PTA L3-020 至多删三个字符 (序列dp/序列自动机)
给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 1] 内的字符串. 输 ...
- PS常用美化处理方法大全
学习PS的同学都知道,我们日常生活中使用PS就是进行一些简单的图像美白,图像颜色的优化,其他的基本不用,在长时间的PS使用过程中本人总结了一些处理皮肤的方法,都是一些非常简单的方法,希望能够帮助那些刚 ...
- python Beautiful Soup的使用
上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表 达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫B ...
- Block Towers (思维实现)
个人心得:这题没怎么看,题意难懂.后面比完再看的时候发现很好做但是怎么卡时间是个问题. 题意:就是有m个可以用2层积木的,n个可以用三层积木的,但是他们不允许重复所以可以无限添加. 比如 3 2 一开 ...
- 【知识笔记】前端样式CSS
一.页脚如何始终固定在页面底部显示 想要达到页脚固定在页面底部显示,也就是当页面主体高度在浏览器高度范围内时页脚靠浏览器底部,超出浏览器高度时页脚在页面主体下方,相当于在高度上的自适应. 乍看似乎很简 ...