我们都知道事务的概念,那么事务的传播特性是什么呢?(此处着重介绍传播特性的概念,关于传播特性的相关配置就不介绍了,可以查看spring的官方文档)
在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层 那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要么全部成功,要么全部失败。那么事务的传播特性也是从这里说起的。
如果你在你的Service层的这个方法中,除了调用了Dao层的方法之外,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用的这个方法与我本身的方法处在同一个事务中,否则如果保证事物的一致性。事务的传播特性就是解决这个问题的,“事务是会传播的”在Spring中有针对传播特性的多种配置我们大多数情况下只用其中的一种:PROPGATION_REQUIRED:这个配置项的意思是说当我调用service层的方法的时候开启一个事务(具体调用那一层的方法开始创建事务,要看你的aop的配置),那么在调用这个service层里面的其他的方法的时候,如果当前方法产生了事务就用当前方法产生的事务,否则就创建一个新的事务。这个工作使由Spring来帮助我们完成的。
以前没有Spring帮助我们完成事务的时候我们必须自己手动的控制事务,例如当我们项目中仅仅使用hibernate,而没有集成进spring的时候,我们在一个service层中调用其他的业务逻辑方法,为了保证事物必须也要把当前的hibernate session传递到下一个方法中,或者采用ThreadLocal的方法,将session传递给下一个方法,其实都是一个目的。现在这个工作由spring来帮助我们完成,就可以让我们更加的专注于我们的业务逻辑。而不用去关心事务的问题。
默认情况下当发生RuntimeException的情况下,事务才会回滚,所以要注意一下 如果你在程序发生错误的情况下,有自己的异常处理机制定义自己的Exception,必须从RuntimeException类继承 这样事务才会回滚!
事务的传播行为和隔离级别[transaction behavior and isolated level]
一、Propagation :
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
很多人看到事务的传播行为属性都不甚了解,我昨晚看了j2ee without ejb的时候,看到这里也不了解,甚至重新翻起数据库系统的教材书,但是也没有找到对这个的分析。今天搜索,找到一篇极好的分析文章,虽然这篇文章是重点分析PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRED_NESTED的
解惑 spring 嵌套事务
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
*************************************************************************在这篇文章里,他用两个嵌套的例子辅助分析,我这里直接引用了。
ServiceA {
void methodA() {
ServiceB.methodB();
}
}
ServiceB {
void methodB() {
}
}
我们这里一个个分析吧
1: PROPAGATION_REQUIRED
加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务
比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,
ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA
的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。
这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被
提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行
这就跟平常用的普通非事务的代码只有一点点区别了。不理这个,因为我也没有觉得有什么区别
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。
这个就比较绕口了。 比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,
那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,
他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在
两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,
如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。
当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,
那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。
不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,
那么ServiceB.methodB就要抛出异常了。
理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,
而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
而Nested事务的好处是他有一个savepoint。
*****************************************
ServiceA {
void methodA() {
try {
//savepoint
ServiceB.methodB(); //PROPAGATION_NESTED 级别
} catch (SomeException) {
// 执行其他业务, 如 ServiceC.methodC();
}
}
}
********************************************
也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA也会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如
ServiceC.methodC,继续执行,来尝试完成自己的事务。
但是这个事务并没有在EJB标准中定义。
二、Isolation Level(事务隔离等级):
1、Serializable:最严格的级别,事务串行执行,资源消耗最大;
2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。
4、Read Uncommitted:保证了读取过程中不会读取到非法数据。
我们知道并行可以提高数据库的吞吐量和效率,但是并不是所有的并发事务都可以并发运行,这需要查看数据库教材的可串行化条件判断了。
这里就不阐述。
我们首先说并发中可能发生的3中不讨人喜欢的事情
1: Dirty reads--读脏数据。也就是说,比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。
2: non-repeatable reads--数据不可重复读。比如事务A中两处读取数据-total-的值。在第一读的时候,total是100,然后事务B就把total的数据改成200,事务A再读一次,结果就发现,total竟然就变成200了,造成事务A数据混乱。
3: phantom reads--幻象读数据,这个和non-repeatable reads相似,也是同一个事务中多次读不一致的问题。但是non-repeatable reads的不一致是因为他所要取的数据集被改变了(比如total的数据),但是phantom reads所要读的数据的不一致却不是他所要读的数据集改变,而是他的条件数据集改变。比如Select account.id where account.name="ppgogo*",第一次读去了6个符合条件的id,第二次读取的时候,由于事务b把一个帐号的名字由"dd"改成"ppgogo1",结果取出来了7个数据。
Serializable 不会 不会 不会
REPEATABLE READ 不会 不会 会
READ COMMITTED 不会 会 会
Read Uncommitted 会 会 会
三、readOnly
事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务。这是一个最优化提示。在一些情况下,一些事务策略能够起到显著的最优化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)时避免dirty checking(试图“刷新”)。
相关推荐
事务传播行为(Propagation)定义了当一个事务方法被另一个事务方法调用时的行为。在Spring中,这些行为可以通过`TransactionDefinition`接口中的常量来指定。具体来说,`TransactionDefinition`定义了以下七种传播...
Spring Boot 支持使用注解来控制事务的传播行为。例如,通过在方法上使用 `@Transactional` 注解,可以轻松地将事务管理应用于特定的方法或类。 #### 六、注意事项 虽然 Spring 和 Spring Boot 提供了强大的事务...
第五点:代码演示事务传播行为 第六点:代码演示事务隔离级别 第七点:Bean的循环依赖 第八点:Spring的八大设计模式 第九点:17种注入方案,其他视频讲10种以内。 第十点:Bean的8种Scope,其他视频最多讲4种。 第...
- **事务管理**:Spring的声明式事务管理让事务处理变得简单,可以在配置文件中设定事务的传播行为和回滚规则。 - **安全控制**:SSH框架可以结合Spring Security(原Acegi)进行权限控制,保护敏感资源。 - **...
【绿谷员工行为准则】 绿谷公司的员工行为准则是其管理制度的重要组成部分,旨在规范员工的行为,确保公司的正常运作和高效发展。准则分为四个主要部分:工作职责、工作态度、行为准则和安全保密。 1. 工作职责: ...
1. 知识分子的定义和角色:在公众场合坚持讲道理,传播知识,维护公共利益。 2. 公共领域的“群己权界”:明确个人行为对公共空间的影响,尊重公共秩序。 3. 知识的公共属性:知识的传播对于提升社会生活质量至关...
1. 卫生习惯的重要性:演讲稿中强调了讲卫生对于个人及环境的影响,尤其是在疫情背景下,保持良好的卫生习惯是防止疾病传播的关键。初中生作为青少年,养成良好的卫生习惯有助于自身健康,也能为社会做出贡献。 2. ...
【标题】和【描述】中提到的...综上所述,奉献精神是社会进步和个人成长的重要组成部分,它体现了人类的道德高度和人文关怀,无论在个人生活还是公共事务中,都应该积极倡导和实践奉献行为,让奉献成为一种责任和习惯。
传播行为:A-->B,在B上声明是否一定需要事务管理 requerd:必须的(默认),如果A有事务那么就加入A的事务,如果A没有事务那么单独创建一个事务 supports,如果A有事务则加入,如果没有就算了 隔离级别 default:...
- **事务传播行为**:定义在有事务上下文环境中如何开始新事务。 #### 6.2 多租户架构 - **Schema隔离**:每个租户拥有自己的模式。 - **Table隔离**:每个租户拥有自己的一套表。 #### 6.3 异步与批处理 - **异步...
希望通过我们的共同努力,每一位同学都能成为一个遵守规则、有责任感、有爱心、讲卫生的好学生,为自己也为他人创造一个安全、健康、和谐的成长环境。红领巾广播站将始终陪伴大家,传播正能量,培养我们成为社会的...
应保持适度的距离,避免过于亲密的行为,同时尊重对方,不传播不健康的信息。在交往中,要遵循原则,如不轻易赠送礼物,女生要注意举止得体,男生则需展现出尊重和理解。通过健康、正常的交往,男女同学可以增进理解...
第二讲:事务文书概述 事务文书是日常工作中的常见文件类型,如会议纪要、通知、策划书等。会议纪要是对会议讨论内容的整理,需详实、准确,体现决策和行动要点;通知用于传达指令或安排,要求明确具体,有时效性;...
本教案针对二年级学生,旨在通过教学培养他们讲卫生、爱整洁的习惯,理解清洁的重要性及其对身心健康的积极影响。课程分为两课时,第一课时主题为“我们爱清洁”,第二课时主题为“不随地吐痰”。 **第一课时:我们...
【交易费用的内涵】广泛涵盖多个方面:信息搜集与传播、讨价还价、合同制定与执行、监督与违约处理、产权保护等。交易费用可以从契约过程、交易维度、设立参照系和生产过程四个角度进行解释: 1. **契约过程**:...
政务业务内网处理内部事务,政务外网面向公众提供服务,而安全平台则确保整个系统的安全运行。 【安全平台设计】 安全平台是电子政务系统的核心,它提供一站式服务,包括统一的接入、安全支撑以及业务逻辑模块。这...
在八年级上册的道德与法治课程中,涵盖了多个核心知识点,主要涉及自我认知、社会关系、亲社会行为、网络生活、社会秩序与规则、尊重与文明礼貌、诚信、违法行为与犯罪、责任与关爱、服务社会、国家利益与国家安全、...
Spring的事务传播行为包括REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED。 【设计模式】 常见的设计模式包括单例模式、工厂模式、建造者模式、装饰者模式、代理模式、观察者模式、...
我注意到班级中存在部分学生的体质差异,因此在日常生活中我不断强调体育锻炼的重要性,希望通过有规律的体育活动,增强学生的身体素质,同时预防疾病的传播。 安全教育始终是我关注的重点。我在日常教学中不断强化...