一起聊聊“事务”那些事

  • 事务的概念

1、          事务可以看作是由对数据库的若干操作组成的一个单元,这个单元是一个整体,该整体具有高度集体责任感、荣誉感,执行操作时要么都成功,要么都失败,从而保证数据满足一致性的要求;

2、          事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异。

  • 事务的例子

1、     银行转账:帐户A把一定数量的款项转到帐户B上,这个操作包括两个步骤,一个是从帐户A上把存款减去一定数量,二是在帐户B上把存款加上相同的数 量。这两个步骤显然要么都完成,要么都取消,否则银行就会受损失。显然,这个转帐操作中的两个步骤就构成一个事务。

  • 事务的特性

1、原子性(Atomicity):

中学的化学课上我们都知道,原子不具备分割性,所以事务的原子特性就是指操作要么都成功,要么都失败,不可分割;

2、一致性(Consistency):

个人理解,一致性的属性与原子性具有一定的相同点,比如操作都成功或都失败都是一致性的表现形式;

3、隔离性(Isolation):

指当前的事务与其他的事务是隔离的。比如用户A和B都在操作数据库中的同一对象,A进行的是插入表值得操作,B进行是查询表中列值得平均数,隔离就是不能因为A在不断地插入新值,而B就不能求平均值或者求出的平均值会因为A的插入而变化;另外,隔离机制还涉及到oracle的锁,后续详细分析。

4、持久性(Durability):

持久性是指事务提交(commit)或者回滚(rollback)的结果集确认固定化,简单理解为,提交或者回滚的结果不能改变了,影响是持久性的。

未结束的事务(事务过程没有处理完毕,正在执行中)在遇到断电或系统错误等故障,即使未结束的事务部分作用的结果已经写入内存,但数据库在下次自动启动时会回滚取消;相反,如果事务已经执行完毕,但是没有来得及写入内存,数据库在下次自动启动的时候,会通过事务日志中的记录进行“重做”,即把丢失的数据修改结果重新生成,并写入内存,从而保证结束事务对数据修改的永久化;

  • 隔离标准

在SQL92标准中,事务隔离级别分为四种,分别为:Read Uncommitted、Read Committed(提交读)、Read Repeatable、Serializable(串行读),其中Read Uncommitted与Read Committed为语句级别的,而Read Repeatable与Serializable是针对事务级别的。

Oracle中只有两种隔离级别:Read Committed(提交读)、Serializable(串行读),前者属于语句级别,后者属于事务级别;

  • READ COMMITED(提交读)

Oracle默认隔离级别;

每条语句都支持语句级读一致性;

不允许脏读(错读),但是可能会出现不可重复读和幻读的情况;

  • SERIALIZABLE(串行读)

需要用户单独设置隔离级别,设置方式详情见第七章内容;

简单理解,在serializable模式下其他事务对同一对象的更新、删除、插入操作都不会影响本事务的select的查询结果,因为本事务中的数据是回滚段内的,只有本事务更DML操作才会影响本事务的查询结果。

serializable模式下不会出现脏读、不可重复读、幻读的情况;

注释:

脏读(错读):当前事务读取了其他事务还没有提交的结果;

不可重复读:其他事务执行更新操作导致当前事务重新查询时结果不一致;

幻读:与不可重复读类似,但是特指其他事务执行插入操作后导致当前事务重新查询时结果不一致;

两种隔离机制区别图:


模式名称


脏读(错读)


不可重复读


幻读


READ COMMITED


×




SERIALIZABLE


×


×


×

  • 隔离级别设置方式

方式一:

SET TRANSACTION ISOLATION LEVEL READ COMMITED;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

方式二:

ALTERSESSION SET ISOLATION_LEVEL=READ COMMITED;

ALTERSESSION SET ISOLATION_LEVEL=SERIALIZABLE;

关于两种设置方式的区别:


设置方式


起始生效时间


终止有效时间


备注说明


SET


本命令执行完毕开始


一个事务提交或回滚


ALTER


Select语句执行时


会话终止或关闭


推荐这种方式测试

  • 关于串行隔离下的几种试验

试验开始前,我们需要搭建试验环境,准备两个sqlplus会话窗口A和B,下面是会话名设置方式:SETSQLPROMPT “A”; SET SQLPROMPT “B”;

我们需要创建一个test测试表,用作我们串行隔离机制试验

SQL>DROP  TABLE  test;

SQL> CREATE TABLE  test  (tnonumber(4));

SQL>INSERT INTO  test  VALUES(1);

SQL>INSERT INTO  test  VALUES(2);

然后设置串行隔离机制,为了试验方便,我们采用ALTER 方式进行设置

A和B会话都需要执行下面的语句:

ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE;

试验一:更新已提交的插入(B比A早)

1、  会话B执行

SQL>INSERT INTO  test  VALUES(3);

插入完毕后,暂不COMMIT;

2、  切换至A会话执行

SQL>SELECT  *  FROMtest;

3、  切换至B会话执行COMMIT;

4、  切换至A会话执行

SQL>UPDATE test SET tno= tno +1(tno各自加1)

5、  A会话提示已更新2行;

6、  结论:成功,但是只更新回滚段内数据,不会发生数据丢失;

试验二:更新已提交的插入(A比B早)

1、  会话A执行

SQL>SELECT  *  FROMtest;

2、  切换至B会话执行

SQL>INSERT INTO  test  VALUES(3);

3、  B会话执行COMMIT;

4、  切换至A会话执行

SQL>UPDATE test SET tno= tno +1(tno各自加1)

5、  A会话提示:ORA-08177:无法连续访问此事务处理

6、  结论:失败,更新会导致数据丢失;

试验三:更新已提交的删除(B比A早)

1、  会话B执行

SQL>DELETE  test  WHERETNO=’2’;

删除完毕后,暂不COMMIT;

2、  切换至A会话执行

SQL>SELECT  *  FROM  test;

3、  切换至B会话执行COMMIT;

4、  切换至A会话执行

SQL>UPDATE test SET tno= tno +1(tno各自加1)

5、  A会话提示:ORA-08177:无法连续访问此事务处理

6、结论:失败,更新会导致数据丢失;

试验四:更新已提交的删除(A比B早)

1、  会话A执行

SQL>SELECT  *  FROMtest;

2、会话B执行

SQL>DELETE  test  WHERETNO=’2’;

3、切换至B会话执行COMMIT;

4、切换至A会话执行

SQL>UPDATE test SET tno= tno +1(tno各自加1)

5、A会话提示:ORA-08177:无法连续访问此事务处理

6、结论:失败,更新会导致数据丢失;

  • 九、关于一个会话窗口中同时存在两种方式的serializable设置

虽然实际环境中不用这样操作,但是这里的叙述是想告诉大家:如果真的有这种情况,那么一定是ALTER 在第一行,SET在第二行,否则报错。

因为SET这种设置方式一旦执行就开启了串行隔离机制,这种机制随着commit或者rollback命令而结束,所以串行事务开启后就不能再次使用ALTER 命令行方式进行设置;

相反,如果ALTER命令行方式是在第一个select命令执行时才开启隔离机制,所以再使用SET方式也是可以的。

最后还是需要告诉大家ALTER和SET起始生效范围

时间: 2024-10-02 20:46:03

一起聊聊“事务”那些事的相关文章

Python番外 事务 那些事

Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一般就不做了,要么做完,要么就不做.也就是说,事务必须是一个不可分割的整体,就像我们在化学课里学到的原子,原子是构成物质的最小单位.于是,人们就归纳出事务的第一个特性:原子性(Atomicity).我靠,一点都不神秘嘛. 特别是在数据库领域,事务是一个非常重要的概念,除了原子性以外,它还有一个极其重要的特性,那就是:一致性(Consistency).也就是

评论精选:聊聊创业那些事

创业无论在什么时候都是一个很热门的话题.很多人都是对创业充满着无限的向往,那么创业是为了什么呢? 1.为了自由 2.为了"梦想" 3.因为不想打工(or找不到工作) 4.为了赚钱. 5.因为创业比较热门 我们每个人想要创业的目的都是不尽相同,那么要怎么看待创业呢?创业简单吗?看看网友的犀利见解. 在家赚钱的十种方法:我相信在中国,每一个人都有一个创业梦,事实上创业也非常简单,但是我问大家你借过钱吗?有过还不起钱想逃避的经历吗?我相信每一个人都有,那种滋味和压力不好受吧?但如果你要做老板

聊聊视频播放那些事2

MediaPlayer 工作逻辑了解一下 随便画了一下图帮助理解. 打个比喻,mediaplayer 可以为电影播放机.各种view是他的屏幕.回调事件可以理解为电影播放员. 继续聊无逢播放. 第一个页面在播的视频全屏以后或者跳第二页继续无逢播放. 直接的想法是,开始页面播了多少,进到第二页面接着上个播放点继续播.进入第二页后台,初始化mediaPlayer ,setResouce,setSurface ,start,seek到播放点. 会发现这个过程时间很长,转圈圈要好久,这并不是产品经理想要

Nginx的负载均衡的那点事 (转)

本节就聊聊采用Nginx负载均衡之后碰到的问题: Session问题 文件上传下载 通常解决服务器负载问题,都会通过多服务器分载来解决.常见的解决方案有: 网站入口通过分站链接负载(天空软件站,华军软件园等) DNS轮询 F5物理设备 Nginx等轻量级架构 那我们看看Nginx是如何实现负载均衡的,Nginx的upstream目前支持以下几种方式的分配 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,wei

事务管理 异常机制

事务在service层控制,spring对事务管理,通过aop切面配置**.service方法来,对package路径进行配置,配置事务管理器+数据源. 也可以通过@Transaction注解的方式来对方法或类定义事务. 事务在try-catch()层面不要被自身给吞了,需要再次抛出来,事务才会生效,否则事务无法回滚. 事务管理 try - catch  {}  需要再次抛出异常 否则异常被吞掉了导致无法回滚  原文地址:https://www.cnblogs.com/jhuangsjtu/p/

安全狗路演·杭州站

在互联网+时代,不管是电商.P2P.还是游戏行业,创业的热情已经被完全点燃,然而,但是我们常常忽视了创业和奋斗途中一个重要的问题--网络安全.国内知名安全品牌,安全狗将携著名神秘黑客空降杭州楼友会咖啡,与初创者以及广大安全爱好者共同聊聊安全那些事. 这里有成功的创业者,这里有顶尖的企业家,这里有资深的安全专家,这里有专业的安全架构师......只要你敢问,没有我们不能答:只要你想知道,没有我们不能回. "无创业 不安全",安全狗让创业更简单,让创业更安全!同时我们还为现场的朋友们准备了

单身男生必备知识2

有人可能会说,动物是动物,人是人,完全是两码事.我告诉你,武则天在当女皇之前,可是一个驯马高手,她之所以能君临天下,就是她用驯马的那一套用来训人,起到了非常好的效果.其实人在很多时候,和动物一样,都有抹不去的动物本能. ######################################## 到底谁才是那个值得你爱的人?当一个男生同时喜欢上两个女孩时,这个男生会更喜欢谁一些?可能许多人都会对这个问题展开讨论,可能会觉得哪个女孩更优秀,哪个女孩就会得到更多的爱.现实中难道真的是这样的吗?当

关于Python编程的一些问答

关于Python编程的一些问答 导语 大约1个月前,oschina.net和华章图书一起合作做了一个活动:OSC第51期高手问答--聊聊python那些事,来推广我参与撰写的书<编写高质量代码:改善Python程序的91个建议>(豆瓣链接).在回答问题的过程中,我看到有若干问题是好几个人都问了的,就萌发了在事后把这些问答整理整理的想法,以下内容就是来自那一次的问答.为简化整理,已经去掉了提问人的昵称,并做了简单的分类. 纠结的Py2与Py3之选 Q:Python 3 会导致Python的什么前

缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中.然而,这个是逻辑是错误的.试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库.于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了. 我不知道为什么这么多人用的都是这个逻辑,当我在微博上发了这个贴以后,我发现好些人给了好多非常复杂和诡异的方案,所以,我想写这篇文章说一下几