`
Luob.
  • 浏览: 1590016 次
  • 来自: 上海
社区版块
存档分类
最新评论

Spring 第12天,事务传播属性和 隔离级别

阅读更多
1 事务的传播属性(Propagation)

1) REQUIRED ,这个是默认的属性
Support a current transaction, create a new one if none exists.
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。
如图所示:

2) MANDATORY
Support a current transaction, throw an exception if none exists.支持当前事务,如果当前没有事务,就抛出异常。

3) NEVER
Execute non-transactionally, throw an exception if a transaction exists.
以非事务方式执行,如果当前存在事务,则抛出异常。

4) NOT_SUPPORTED
Execute non-transactionally, suspend the current transaction if one exists.
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。  

5) REQUIRES_NEW
Create a new transaction, suspend the current transaction if one exists.
新建事务,如果当前存在事务,把当前事务挂起。
如图所示:

6) SUPPORTS
Support a current transaction, execute non-transactionally if none exists.
支持当前事务,如果当前没有事务,就以非事务方式执行。

7) NESTED (JDBC 3.0)
Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else.
支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

8) PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别
它们非常 类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA 事务管理器的支持。
使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。

2 事务的隔离级别(Isolation Level)

1) 首先说明一下事务并发引起的三种情况

i. Dirty Reads 脏读
一个事务正在对数据进行更新操作,但是更新还未提交,另一个事务这时也来操作这组数据,并且读取了前一个事务还未提交的数据,而前一个事务如果操作失败进行了回滚,后一个事务读取的就是错误数据,这样就造成了脏读。

ii. Non-Repeatable Reads 不可重复读
一个事务多次读取同一数据,在该事务还未结束时,另一个事务也对该数据进行了操作,而且在第一个事务两次次读取之间,第二个事务对数据进行了更新,那么第一个事务前后两次读取到的数据是不同的,这样就造成了不可重复读。

iii. Phantom Reads 幻像读
第一个数据正在查询符合某一条件的数据,这时,另一个事务又插入了一条符合条件的数据,第一个事务在第二次查询符合同一条件的数据时,发现多了一条前一次查询时没有的数据,仿佛幻觉一样,这就是幻像读。

iv. 非重复度和幻像读的区别
非重复读是指同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。(A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data. )

幻像读是指同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition. )

表面上看,区别就在于非重复读能看见其他事务提交的修改和删除,而幻像能看见其他事务提交的插入。

2) DEFAULT (默认)
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应

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

4) READ_COMMITTED (读已提交)
保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

5) REPEATABLE_READ (可重复读)
这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读

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

7) 隔离级别解决事务并行引起的问题
Dirty reads        non-repeatable reads    phantom reads
Serializable                 不会                          不会                        不会
REPEATABLE READ       不会                          不会                          会
READ COMMITTED        不会                           会                           会
Read Uncommitted       会                              会                           会
分享到:
评论
3 楼 lengzl 2014-11-10  
1.嗯,多谢您的指教。我以后也把整理好的精华部分循序渐进的放到 Iteye上,好找。
2.您工作如此勤奋、刻苦,12:00还在工作、学习。让我感到惭愧,我以后也要加倍努力了。
2 楼 Luob. 2014-11-10  
lengzl 写道
请问,您感觉发表在博客上和放在本地相比
有什么优缺点?
我一直不知道 如何处理放到本地还是博客上好.呵呵~


我个人觉得博客上好
第一:容易找,以前我写过好多 日记本,txt,几次搬家,装系统,有的丢了,管理麻烦.而且自己手动写的可能有阅读障碍.

第二:只要这个网站不挂,一直存在,以后老了,还可以回忆自己以前学习奋斗经历


第三:除了怕忘记外,还可以让大家一起看看,写的不好的,还可以让大家指点指点. 总比放在本地沉睡好.
1 楼 lengzl 2014-11-09  
请问,您感觉发表在博客上和放在本地相比
有什么优缺点?
我一直不知道 如何处理放到本地还是博客上好.呵呵~

相关推荐

    Spring框架实用知识库分享

    Spring框架实用知识库...* 介绍Spring中的事务和事务传播,包括事务的基本概念、事务的传播、事务的隔离级别等 * 演示如何使用Spring的事务来实现数据库事务处理 * 介绍如何使用Spring的事务传播来实现分布式事务处理

    动力节点老杜最新版Spring6框架教程学习资料分享

    第五点:代码演示事务传播行为 第六点:代码演示事务隔离级别 第七点:Bean的循环依赖 第八点:Spring的八大设计模式 第九点:17种注入方案,其他视频讲10种以内。 第十点:Bean的8种Scope,其他视频最多讲4种。 第...

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

    第12章 Spring Roo 481 12.1 设置Spring Roo开发环境 483 12.1.1 问题 483 12.1.2 解决方案 483 12.1.3 工作原理 483 12.2 创建第一个Spring Roo项目 486 12.2.1 问题 486 12.2.2 解决方案 486 ...

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

    第12章 整合其他ORM框架 12.1 Spring整合ORM技术 12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate 12.2.3 处理LOB类型数据 12.2.4 添加Hibernate事件监听器 12.2.5 使用原生...

    12spring4_mybatis.rar

    5. **事务管理**:Spring 提供了事务管理功能,可以设置事务的隔离级别、传播行为等。在 Spring 配置文件中,我们可以指定事务管理器类型,如 DataSourceTransactionManager 对于 JDBC 事务,或者 ...

    spring练习及答案.pdf

    Spring提供了声明式事务管理,允许开发者在配置文件中定义事务的传播行为和隔离级别,简化了事务处理。 3. **依赖注入(DI)**:Spring框架的核心特性之一,它允许组件之间的依赖关系在运行时由外部容器(如Spring ...

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

    第12章 Spring Roo 481 12.1 设置Spring Roo开发环境 483 12.1.1 问题 483 12.1.2 解决方案 483 12.1.3 工作原理 483 12.2 创建第一个Spring Roo项目 486 12.2.1 问题 486 12.2.2 解决方案 486 ...

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

    第12章 整合其他ORM框架 12.1 Spring整合ORM技术 12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate 12.2.3 处理LOB类型数据 12.2.4 添加Hibernate事件监听器 12.2.5 使用原生...

    SSM框架面试题.pdf

    - Spring支持四种事务隔离级别:`ISOLATION_DEFAULT`、`ISOLATION_READ_UNCOMMITTED`、`ISOLATION_READ_COMMITTED`、`ISOLATION_REPEATABLE_READ`和`ISOLATION_SERIALIZABLE`。不同的隔离级别可以防止不同的并发...

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

    第11~25行定义了Hibernate的会话工厂,会话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了数据源和资源映射文件,此外还通过一些键值对设置了Hibernate所需的属性。  其中第16行通过类路径的映射方式...

    专高2_练习手册_高性能架构_第20单元2

    9. **Spring事务传播特性**: Spring的事务传播特性定义了在一个事务方法被另一个事务方法调用时如何处理事务,提供了如PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS等多种策略。 10. **Spring JMS抽象**: Spring...

    宜信java程序员面试题.pdf,这是一份不错的文件

    19. 事务传播行为:`PROPAGATION_REQUIRED`、`PROPAGATION_SUPPORTS`、`PROPAGATION_NEVER`、`PROPAGATION_NOT_SUPPORTED`和`PROPAGATION_REQUIRES_NEW`是Spring事务管理的传播行为选项。 20. 事务隔离级别:`...

    郑州数字马力面试(后台java)经验

    事务隔离级别与Spring中的事务传播行为** MySQL支持四种隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。Spring中的事务传播行为主要有REQUIRED、SUPPORTS、MANDATORY等,其中...

    企企通java面试附答案

    - 解析: Spring支持多种事务管理特性,包括事务的传播行为、事务回滚以及事务隔离级别等。 10. **Spring中@Transactional注解的实现机制**: - 正确选项: “对”。 - 解析: `@Transactional` 注解是由Spring AOP...

    java工程师笔试题

    8. Spring支持编程式和声明式事务管理,隔离级别包括READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE,它们决定了事务之间的可见性和一致性。事务的传播行为定义了在一个事务中的方法如何调用另一...

    5.3要问的2.0版本1

    12. **ACID事务处理**:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)是事务处理的四个关键属性,保证了数据库操作的可靠性。 13. **数据库存储过程**:存储过程是预...

Global site tag (gtag.js) - Google Analytics