ImageVerifierCode 换一换
格式:DOCX , 页数:7 ,大小:84.77KB ,
资源ID:15716942      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/15716942.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Spring的7 种事务传播行为Word文档下载推荐.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Spring的7 种事务传播行为Word文档下载推荐.docx

1、隔离性(Isolation)。要想真正的做到操作之间完全没有任何干扰是很难的,于是乎,每天上班打酱油的数据库专家们,开始动脑筋了,“我们要制定一个规范,让各个数据库厂商都支持我们的规范!”,这个规范就是:事务隔离级别(Transaction Isolation Level)。能定义出这样牛逼的规范真的挺不容易的,其实说白了就四个级别:1. READ_UNCOMMITTED2. READ_COMMITTED3. REPEATABLE_READ4. SERIALIZABLE千万不要去翻译,那只是一个代号而已。从上往下,级别越来越高,并发性越来越差,安全性越来越高,反之则反。当我们执行一条 inse

2、rt 语句后,数据库必须要保证有一条数据永久地存放在磁盘中,这个也算事务的一条特性,它就是:持久性(Durability)。归纳一下,以上一共提到了事务的 4 条特性,把它们的英文单词首字母合起来就是:ACID,这个就是传说中的“事务 ACID 特性”!真的是非常牛逼的特性啊!这 4 条特性,是事务管理的基石,一定要透彻理解。此外还要明确,这四个家伙当中,谁才是老大?其实想想也就清楚了:原子性是基础,隔离性是手段,持久性是目的,真正的老大就是一致性。数据不一致了,就相当于“江湖乱套了,流氓戴胸罩”。所以说,这三个小弟都是跟着“一致性”这个老大混,为他全心全意服务。这四个家伙当中,其实最难理解的

3、反倒不是一致性,而是隔离性。因为它是保证一致性的重要手段,是工具,使用它不能有半点差池,否则后果自负!怪不得数据库行业专家们都要来研究所谓的事务隔离级别了。其实,定义这四个级别就是为了解决数据在高并发下所产生的问题,那又有哪些问题呢?1. Dirty Read(脏读)2. Unrepeatable Read(不可重复读)3. Phantom Read(幻读)首先看看“脏读”,看到“脏”这个字,我就想到了恶心、肮脏。数据怎么可能脏呢?其实也就是我们经常说的“垃圾数据”了。比如说,有两个事务,它们在并发执行(也就是竞争)。看看以下这个表格,您一定会明白我在说什么:时间事务 A(存款)事务 B(取款

4、)T1开始事务T2T3查询余额(1000 元)T4取出 1000 元(余额 0 元)T5查询余额(0 元)T6撤销事务(余额恢复为 1000 元)T7存入 500 元(余额 500 元)T8提交事务余额应该为 1500 元才对!请看 T5 时间点,事务 A 此时查询余额为 0 元,这个数据就是脏数据,它是事务 B 造成的,明显事务没有进行隔离,渗过来了,乱套了。所以脏读这件事情是非常要不得的,一定要解决掉!让事务之间隔离起来才是硬道理。那第 2 条,不可重复读又怎么解释呢?还是用类似的例子来说明:事务 A 其实除了查询了两次以外,其他什么事情都没有做,结果钱就从 1000 变成 0 了,这就是

5、重复读了。可想而知,这是别人干的,不是我干的。其实这样也是合理的,毕竟事务 B 提交了事务,数据库将结果进行了持久化,所以事务 A 再次读取自然就发生了变化。这种现象基本上是可以理解的,但在有些变态的场景下却是不允许的。毕竟这种现象也是事务之间没有隔离所造成的,但我们对于这种问题,似乎可以忽略。最后一条,幻读。我去!Phantom 这个单词不就是“幽灵、鬼魂”吗?刚看到这个单词时,真的把我的小弟弟都给惊呆了。怪不得这里要翻译成“幻读”了,总不能翻译成“幽灵读”、“鬼魂读”吧。其实意义就是鬼在读,不是人在读,或者说搞不清楚为什么,它就变了,很晕,真的很晕。还是用一个示例来说话吧:事务 A(统计总

6、存款)事务 B(存款)统计总存款(10000 元)存入 100 元统计总存款(10100 元)银行工作人员,每次统计总存款,都看到不一样的结果。不过这也确实也挺正常的,总存款增多了,肯定是这个时候有人在存钱。但是如果银行系统真的这样设计,那算是玩完了。这同样也是事务没有隔离所造成的,但对于大多数应用系统而言,这似乎也是正常的,可以理解,也是允许的。银行里那些恶心的那些系统,要求非常严密,统计的时候,甚至会将所有的其他操作给隔离开,这种隔离级别就算非常高了(估计要到 SERIALIZABLE 级别了)。归纳一下,以上提到了事务并发所引起的跟读取数据有关的问题,各用一句话来描述一下:1. 脏读:事

7、务 A 读取了事务 B 未提交的数据,并在这个基础上又做了其他操作。2. 不可重复读:事务 A 读取了事务 B已提交的更改数据。3. 幻读:事务 A 读取了事务 B 已提交的新增数据。第一条是坚决抵制的,后两条在大多数情况下可不作考虑。这就是为什么必须要有事务隔离级别这个东西了,它就像一面墙一样,隔离不同的事务。看下面这个表格,您就清楚了不同的事务隔离级别能处理怎样的事务并发问题:事务隔离级别脏读不可重复读幻读READ_UNCOMMITTED允许READ_COMMITTED禁止REPEATABLE_READSERIALIZABLE根据您的实际需求,再参考这张表,最后确定事务隔离级别,应该不再是

8、一件难事了。JDBC 也提供了这四类事务隔离级别,但默认事务隔离级别对不同数据库产品而言,却是不一样的。我们熟知的 MySQL 数据库的默认事务隔离级别就是READ_COMMITTED,Oracle、SQL Server、DB2等都有有自己的默认值。我认为 READ_COMMITTED 已经可以解决绝大多数问题了,其他的就具体情况具体分析吧。若对其他数据库的默认事务隔离级别不太清楚,可以使用以下代码来获取:DatabaseMetaData meta = DBUtil.getDataSource().getConnection().getMetaData();int defaultIsolati

9、on = meta.getDefaultTransactionIsolation();提示:在 java.sql.Connection 类中可查看所有的隔离级别。我们知道 JDBC 只是连接 Java 程序与数据库的桥梁而已,那么数据库又是怎样隔离事务的呢?其实它就是“锁”这个东西。当插入数据时,就锁定表,这叫“锁表”;当更新数据时,就锁定行,这叫“锁行”。当然这个已经超出了我们今天讨论的范围,所以还是留点空间给我们的 DBA 同学吧,免得他没啥好写的了。除了 JDBC 给我们提供的事务隔离级别这种解决方案以外,还有哪些解决方案可以完善事务管理功能呢?不妨看看 Spring 的解决方案吧,其实

10、它是对 JDBC 的一个补充或扩展。它提供了一个非常重要的功能,就是:事务传播行为(Transaction Propagation Behavior)。确实够牛逼的,Spring 一下子就提供了 7 种事务传播行为,这 7 种行为一出现,真的是亮瞎了我的狗眼!1. PROPAGATION_REQUIRED2. RROPAGATION_REQUIRES_NEW3. PROPAGATION_NESTED4. PROPAGATION_SUPPORTS5. PROPAGATION_NOT_SUPPORTED6. PROPAGATION_NEVER7. PROPAGATION_MANDATORY看了Sp

11、ring 参考手册之后,更是晕了,这到底是在干嘛?首先要明确的是,事务是从哪里来?传播到哪里去?答案是,从方法 A 传播到方法 B。Spring 解决的只是方法之间的事务传播,那情况就多了,比如:1. 方法 A 有事务,方法 B 也有事务。2. 方法 A 有事务,方法 B 没有事务。3. 方法 A 没有事务,方法 B 有事务。4. 方法 A 没有事务,方法 B 也没有事务。这样就是 4 种了,还有 3 种特殊情况。还是用我的 Style 给大家做一个分析吧:假设事务从方法 A 传播到方法 B,您需要面对方法 B,问自己一个问题:方法 A 有事务吗?1. 如果没有,就新建一个事务;如果有,就加入

12、当前事务。这就是PROPAGATION_REQUIRED,它也是 Spring 提供的默认事务传播行为,适合绝大多数情况。2. 如果没有,就新建一个事务;如果有,就将当前事务挂起。RROPAGATION_REQUIRES_NEW,意思就是创建了一个新事务,它和原来的事务没有任何关系了。3. 如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。PROPAGATION_NESTED,也就是传说中的“嵌套事务”了,所嵌套的子事务与主事务之间是有关联的(当主事务提交或回滚,子事务也会提交或回滚)。4. 如果没有,就以非事务方式执行;如果有,就使用当前事务。PROPAGATION_SUPPOR

13、TS,这种方式非常随意,没有就没有,有就有,有点无所谓的态度,反正我是支持你的。5. 如果没有,就以非事务方式执行;PROPAGATION_NOT_SUPPORTED,这种方式非常强硬,没有就没有,有我也不支持你,把你挂起来,不鸟你。6. 如果没有,就以非事务方式执行;如果有,就抛出异常。PROPAGATION_NEVER,这种方式更猛,没有就没有,有了反而报错,确实够牛的,它说:我从不支持事务!7. 如果没有,就抛出异常;PROPAGATION_MANDATORY,这种方式可以说是牛逼中的牛逼了,没有事务直接就报错,确实够狠的,它说:我必须要有事务!看到我上面这段解释,小伙伴们是否已经感受到,被打通任督二脉的感觉?多读几遍,体会一下,就是您自己的东西了。需要注意的是PROPA

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1