以下内容均摘自网上资料
1. 脏读,不可重复读,幻象读
- 脏读
当一个事务读取了另一个事务尚未提交的更新,就叫脏读。在另一个事务回滚的情况下,当前事务所读取的另一个事务的数据就是无效的。 解决脏读方法:把事务隔离级别调整到READ COMMITTED
- 不可重复读取
一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。通常这种情况是由于数据在二次查询之间被另一个并发的事务所修改。 解决不可重复读方法: 事务级别:REPEATABLE READ
- 幻象读
一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读。解决方法:把事务隔离级别调整到SERIALIZABLE
幻象读和不可重复读是两个容易混淆的概念,前者是指读到了其它已经提交事务的新增数据,而后者是指读到了已经提交事务的更改数据(更改或删除),为了避免这两种情况,采取的对策是不同的,防止读取到更改数据,只需要对操作的数据添加行级锁,阻止操作中的数据发生变化,而防止读取到新增数据,则往往需要添加表级锁——将整个表锁定,防止新增数据(Oracle使用多版本数据的方式实现)。
2. Spring事务属性
- 事务的传播特性(Propagation)
- 事务的隔离级别(Isolation)
- 事务的只读属性
- 事务的超时属性
1). 事务的传播特性(Propagation)
常见的传播特性有:
(1). PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
(2). PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
(3). PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
(4). PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
(5). PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
(6). PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
Spring配置事务传播行为的代码(配置文件,此处使用到了Spring 配置文件的tx标签;也可使用注解配置这些东东,具体代码不写了)
<!-- 配置当前事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref bean="sessionFactory" /></property>
<property name="NestedTransactionAllowed" value="true"></property>
</bean>
<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="find*" read-only="true" /> <!-- 这里的read-only就是后面要说到的事务的只读属性 -->
</tx:attributes>
</tx:advice>
2). 事务的隔离级别
(1). ISOLATION_DEFAULT: 使用数据库默认的事务隔离级别.
(2). ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许其它事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
(3). ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被其它事务读取,其它事务不能读取该事务未提交的数据。可避免脏读。
(4). ISOLATION_REPEATABLE_READ: 它除了保证一个事务不能读取另一个事务未提交的数据外,也可避免脏读。这种事务隔离级别可以防止脏读,不可重复读,但是可能出现幻像读。
(5). ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
3). 事务的只读属性
此属性是可选的,表示该事务不参与数据库更新操作,事务声明只读后,数据库会对该事务进行一些优化,以提升速度和性能,如Oracle对于只读事务,不启动回滚段,不记录回滚log。 只读属性需要配合传播属性一起设置,设置代码,参看上面的传播特性代码
4). 事务的超时属性
这个属性和事务的只读属性一样需要搭配事务的传播行为共同设置,它设置了事务的超时时间,事务本身可能会因某种原因很长没有回应,在这期间事务可能锁定了数据库的表格,这样会出现严重的性能问题。通过设置事务的超时时间,从开始执行事务起,在规定的超时时间内如果没有事务就将它回滚。 此设置也需要和传播特性一起设置,设置代码例子(咦,怎么没搜到这样的代码,自己也懒得写了)
OK,终于理个差不多了。 上面的这些都是搜集了多篇文章整理出来的,自己认为容易懂的。感谢这些的原作者
分享到:
相关推荐
spring学习笔记事务的
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 AOP编程的支持 Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能 声明式事务的支持 只需要通过配置就可以...
(三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步...
NULL 博文链接:https://microjava.iteye.com/blog/525981
full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业...
目录: Spring教程 1 名词解释 2 Spring框架概述 3 ...Spring的声明式事务 22 Spring对其它企业应用支持 22 注:后面的内容我将不再完善,但网上的朋友可以帮助完善,只需注明住处即可。
NULL 博文链接:https://vzhchv0010.iteye.com/blog/356142
Spring.NET事务配置模板。 原文出处:http://www.cnblogs.com/GoodHelper/archive/2009/11/16/SpringNet_Transaction.html
NULL 博文链接:https://microjava.iteye.com/blog/525973
个人笔记
声明式事务控制Spring提供对事务的控制管注解方式事务属性事务传播为如果当前方法有事务,当前方法事务会挂起,在为加入的方法开启一个新的事务,直到新的事务执完、
spring学习笔记脑图,简单理解aop ioc 事务管理,和spring的基本结构以及底层原理所用到的设计模式
Spring入门学习笔记,内容包括Spring介绍,Spring配置文件,Spring配置数据源,Spring的注解开发,Spring集成Junit,Spring的AOP,jdbcTemplate介绍,Spring控制事务流程,Spring集成web。
Spring个人笔记,共计59页。第一天内容:Spring框架简介(EJB、JMX、Spring核心功能、Spring模块详解、Spring重要概念(容器)、Spring容器初始化的整个流程、Spring后处理器),IOC详解,Spring环境搭建,Spring...
1.Spring入门和IOC介绍 2.对象依赖 3.AOP入门 4.JDBCTemplate和Spring事务 5.Spring事务原理 6.Spring事务的一个线程安全问题 7.IOC再回顾和面试题 8.AOP再回顾
1、为什么要使用Spring? 2、Bean 3、Spring事务 4、基本框架 5、面向切面编程 6、为Spring添加REST功能 7、spring计划任务 8、spel 9、面试
Spring.NET事务管理机制 原文:http://www.cnblogs.com/GoodHelper/archive/2009/11/16/SpringNet_Transaction.html
maven笔记 mybatis笔记 Redis笔记 springAOP笔记 springIOC笔记 springMVC笔记 spring事务管理笔记 SVN笔记
(三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步...
Spring的事务管理及实现,Spring操作Hibernate的事务管理器; 回顾上次课的要点: 代理模式,AOP框架,Spring中AOP的实现方式 一、Spring的事务管理 传统数据库事务的特性: Atomic: 原子性. 事务中的各个...