`

使用Spring的事务管理----传播性和隔离性

阅读更多

在上面几篇日志配置Spring事务的时候都涉及到了事务的传播和隔离性,这里具体深入理解一下。

当多个事务嵌套时,某个事务的propagation事务传播将会直接影响最终的执行效果。

具体propagation的解释如下:

propagation属性 说明
 REQUIRED  无论当前事务上下文中有没有事务,都会创建一个新的事务。也即逻辑需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务
 SUPPORTS  如果当前事务上下文中有一个事务,那么使用事务上下文中的事务(加入外层的事务,成为外层事务的一部分);如果没有,那么按照无事务的方式执行
 MANDATORY  如果当前事务上下文中有一个事务,那么使用事务上下文中的事务;如果没有,那么抛出 IllegalTransactionStatException
 REQUIRES_NEW  无论当前事务上下文中没有有事务,都会开启一个新的事务。也即逻辑总是会为自己发起一个新的事务,如果方法已运行在一个事务中,则原有事务被挂起,新的事务被创建,直到方法结束,新事务才结束,原先的事务才会恢复执行
 NOT_SUPPORTED  无论当前事务上下文中有没有事务,都会按照无事务的方式执行。----不使用事务,如果当前有事务,则挂起事务。-----如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行
 NEVER  如果当前事务上下文中有一个事务,就会抛出 IllegelTransactionStatException
 NESTED  在当前事务上下文的事务中增加一个保存点,如果内嵌事务发生回滚,只会回滚内嵌的事务,不会回滚外层事务。如果外层没有事务,则按照REQUIRED方式执行

 -----------------------------------------------------------------------------------------------------------------------------

事务隔离性

多个事务并发执行可能出现以下问题:

脏读:一个事务读到另一个事务未提交的更新数据。

例如事务1更新了一条记录,然后事务2读取了该条记录,但是然后事务1回滚了它的更新操作,导致事务2读取的记录其实不是数据库中记录的真实值,出现了脏读。

 

不可重复读:在同一个事务中,多次读取同一数据,返回的结果有所不同。因为后续读取可以读到另一个事务已提交的更新数据。

 

幻读:一个事务读取到另一个事务已提交的insert数据。

例如事务1读取了数据库中年龄大于30岁的20条记录,然后事务2插入了一条年龄大于30岁的记录,然后事务1再次读取年龄大于30岁的记录,发现变成了21条,以为产生了幻觉。

  -----------------------------------------------------------------------------------------------------------------------------

Spring的事务管理提供了5种事务隔离性属性来解决以上问题:

ISOLATION_DEFAULT是采用数据库默认隔离级别。

ISOLATION_READ_UNCOMMITTED: 事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离会产生脏读,不可重复读和幻读。

ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。

ISOLATION_REPEATABLE_READ: 这种事务隔离界别可以防止脏读,不可重复读。但是可能出现幻读。它除了保证一个事务不能读取另外一个未提交的数据外,还避免了不可重复读现象。

ISOLATION_SERIALIZABLE: 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。

 

隔离级别 脏读 不可重复读 幻读

未授权读

READ_UNCOMMITTED

可能发生 可能发生 可能发生

授权读

READ_COMMITTED

不会发生 可能发生 可能发生

可重复读

REPEATABLE_READ

不会发生 不会发生 可能发生

序列化

SERIALIZABLE

不会发生 不会发生 不会发生

 

 

分享到:
评论

相关推荐

    spring事务-项目案例-PPT解读.zip

    1.业务代码列举7种事务传播机制的情况,每个测试方法都附带日志分析记录、使用场景和实际场景,小白也能看得懂!!! 2.在测试类Test包下,使用juniter进行测试,方便快捷清晰。 ①用到了@BeforeEach,正式执行测试...

    Spring事务传播属性和隔离级别详细介绍

    主要介绍了Spring事务传播属性和隔离级别详细介绍,同时涉及传播行为介绍,超时设置等相关内容,需要的朋友可以参考下。

    编程语言+JAVAspring+事务管理+数据一致性

    它介绍了JAVAspring的事务管理的概念、原理和作用,以及如何使用JAVAspring的事务管理来保证数据的一致性,包括事务的属性、传播行为、隔离级别、回滚规则等内容,以及一些配置文件和注解的用法。

    Spring.3.x企业应用开发实战(完整版).part2

    10.3.1 Spring事务传播机制回顾 10.3.2 相互嵌套的服务方法 10.4 多线程的困惑 10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的...

    Spring攻略(第二版 中文高清版).part1

    10.6 使用BlazeDS和Spring消费面向消息的服务 421 10.6.1 问题 421 10.6.2 解决方案 422 10.6.3 工作原理 422 10.7 将依赖注入带给你的ActionScript客户 434 10.7.1 问题 434 10.7.2 解决方案 434 ...

    Spring攻略(第二版 中文高清版).part2

    10.6 使用BlazeDS和Spring消费面向消息的服务 421 10.6.1 问题 421 10.6.2 解决方案 422 10.6.3 工作原理 422 10.7 将依赖注入带给你的ActionScript客户 434 10.7.1 问题 434 10.7.2 解决方案 434 ...

    Spring3.x企业应用开发实战(完整版) part1

    10.3.1 Spring事务传播机制回顾 10.3.2 相互嵌套的服务方法 10.4 多线程的困惑 10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的...

    Spring + Hibernate + Struts

    比如说hibernate,我问一个同学session接口的get和load方法有何异同,这位...另外一个说精通spring,很多流行的词语,什么aop啊,什么声明性事务管理等等,我就问他spring里面事务的传播属性和事务隔离级别是怎么回事

    一次性搞定数据库事务

    彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROP

    ssh(structs,spring,hibernate)框架中的上传下载

    系统Web层将来切换到另一种实现技术的可能性也微乎其微,所以笔者觉得没有必要为了这个业务层完全独立于调用层的过高目标而去搞一个额外的隔离层,浪费了原材料不说,还将系统搞得过于复杂,相比于其它原则,"简单...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    4.3 事务隔离、传播属性的设置 198 4.3.1 并发访问和隔离 198 4.3.2 事务属性 199 4.4 EJB的事务管理 201 4.4.1 容器管理事务(CMT) 201 4.4.2 Bean管理事务(BMT) 201 4.5 事务超时设置 201 4.6 本章小结 203 第5章 ...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题54.Spring事务的传播特性和隔离级别.mp4 │ Java面试题55.ORM是什么?ORM框架是什么?.mp4 │ Java面试题56.ibatis和hibernate有什么不同.mp4 │ Java面试题57.hibernate对象状态及其转换.mp4 │ Java...

    leetcode下载-JavaTopic:Java面试题总结

    spring事务7种传播特性和隔离级别的理解? spring boot的启动过程 spring事务实现的原理 aop切面 如何解决spring循环依赖问题? Redis篇: redis持久化的原理(RDB、AOF); redis缓存穿透、缓存雪崩,有没有在实际...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【Spring】Spring事务机制 93 声明式事物 93 编程式事务 94 【Spring】Spring声明式事务的五个特性 94 传播性 94 隔离级别 95 只读 96 事务超时 97 回滚规则 97 【Spring】SpringMVC请求处理流程 97 【Mybatis】...

Global site tag (gtag.js) - Google Analytics