事务是一个完整的逻辑单元,在执行的时候要嘛同时成功,要嘛同时失败,中间不允许被中断,也就是说事务是一个全有或全无的过程。
事务拥有4个特性:
原子性:事务是由一个或者多个活动单元组成的。原子性确保了事务中所有操作全部发生或者全部不发生。如果所有活动都成功了,事务也就成功了。如果任意一个活动失败了,整个事务也就失败并回滚。
一致性:一旦事务完成(不管成功或者失败),事务保证业务处于一致的状态,数据不允许被破坏(所有活动要嘛成功一致,要嘛失败一致)。
隔离性:事务允许多个用户对相同数据进行操作,每个用户的操作不会与其他用户纠缠在一起。因此,事务会被隔离,避免发生同步读写数据的事情(隔离往往会涉及到锁定数据库的行或者表)
永久性:一旦事务完成,事务的结果应该被持久化,这样就能从任意的系统崩溃中恢复过来。
Spring对编程式和声明式事务进行支持,编程式事务允许用户进行精确的事务控制,声明式(方法级别)以用户透明的形式对目标对象应用事务管理,无论采用何种方式,spring自己没有事务控制,而是提供了自己的事务管理器,将事务的职责委托给了其他的持久化平台进行实现,例如hibernate,JPA,JTA等等,对于在spring中使用事务,基本都可以不用关心持久化平台(框架)对事务的实现。
所有的事务管理器都实现了PlatformTransactionManager。
JDBC事务:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
hibernate事务:
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
注意:如果使用hibernate2.0,必须使用spring2.0用于集成,不然会出现错误
JPA事务:
<bean id="transactionManager3" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="emf"></property> </bean>
让JPA事务支持高级特性:
<bean id="transactionManager3" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="emf"></property> <property name="jpaDialect" ref="jpaDialect"></property> </bean> <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"></bean>
这里配置了JpaDialect,JpaDialect支持使用特定的事务语义(例如用户自定义的事务隔离级别和事务超时),获取具备事务功能的Connection对象(暴露给基于JDBC的DAO),从 PersistenceExceptions
到Spring的 DataAccessExceptions
高级转化。
Spring编程式事务:
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"></property> </bean>
@Inject private TransactionTemplate txTemplate; public void test(){ txTemplate.execute(new TransactionCallback<Void>() { @Override public Void doInTransaction(TransactionStatus status) { //do your business code return null; } }); }
调用execute方法,构造匿名内部类,在doInTransaction方法中编写的代码就位于事务当中
Spring声明式事务:
spring对声明式事务的支持是通过spring AOP实现的,在过去的日子里,spring采用TransactionProxyFacotyBean来代理需要进行事务的对象,进行声明式事务的管理,目前这种方式已经被淘汰,取而代之的是spring2.0之后的命名空间配置和@Transactional注解。
声明式事务通过事务属性来进行定义,通过配置事务属性来进行事务管理策略
以下是事务属性:
传播行为:定义了客户端与被调用方法之间的事务边界
传播行为 | 含义 |
PROPAGATION_MANDATORY | 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常 |
PROPAGATION_NESTED | 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行,嵌套事务可以独立于当前事务进行单独的提交或者回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样,各厂商对其支持不同,参考文档是否支持嵌套事务 |
PROPAGATION_NEVER | 表示当前方法不应该运行在事务上下文中,如果当前有一个事务正在运行,则会抛出异常 |
PROPAGATION_NOT_SUPPORTED | 表示当前方法不应该运行在事务上下文当中,如果存在当前事务,该方法在运行期间,当前事务将会被挂起,如果使用JTATransactionManager的话,则需要访问TransactionManager |
PROPAGATION_REQUIRED | 表示当前方法必须运行在事务当中,如果当前事务存在,方法会在当前事务中运行,否则,会启动一个新的事务 |
PROPAGATION_REQUIRES_NEW | 表示当前方法必须运行在它自己的事务当中,一个新的事务将会被启动,如果当前存在事务,在该方法运行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager |
PROPAGATION_SUPPORTS | 表示当前方法不需要事务上下文,但是存在当前事务,那么该方法会运行在当前事务当中 |
隔离级别:定义事务与其他事务之间相互的影响程度
事务隔离级引发的现象:
脏读:一个事务改写了数据,但是没有提交,另外一个事务可以读到之前事务改写但是未提交的数据
不可重复读:一个事务针对某一个数据执行相同的两次查询,另外一个事务在此期间对该数据进行了修改和删除,那么之前的事务查询出来的两次结果会不同
幻读:一个事务针对某一个数据执行了相同的两次查询,另外一个事务在此期间对该数据进行了新增,那么之前的事务查询出来的第二次结果会出现新数据
理想状态下,两个事务之间是完全隔离的,但是完全隔离之后会造成性能问题(表和行锁),这叫造就了用户需要灵活的根据情况在程序中自定义隔离级别:
隔离级别 | 含义 |
ISOLATION_DEFAULT | 使用后端数据库默认的隔离级别 |
ISOLATION_READ_UNCOMMITTED | 允许读取尚未提交的数据变更,可能会影响脏读,不可重读以及幻读 |
ISOLATION_READ_COMMITED | 允许读取并发事务中已经提交的数据,可以组织脏读,但是幻读和不可重复读仍有可能发生 |
ISOLATION_REPEATABLE_READ | 对同一字段的多次读取结果是一致的,除非是被本事务修改,可以组织脏读和不可重复读,但幻读仍有可能产生(因为幻读是新增操作) |
ISOLATION_SERIALIZABLE | 完全服从ACID的隔离级别,确保阻止脏读,不可重复读,以及幻读,这是性能最慢的事务隔离级别,因为通常是完全锁定表来进行实现的 |
并不是所有的数据库都支持以上表格中的隔离级别,详细情况请参照数据库文档
只读:
只读是由后端的数据库进行的,数据库可以利用事务的只读操作进行特定的优化,只读优化只有在事务启动的时候由数据库实施的,所以配置PROPAGATION_NESTED,PROPAGATION_REQUIRES_NEW,PROPAGATION_REQUIRED才有意义。
事务超时:
为了使程序运行良好,事务不能占用太长时间,设置事务超时来管理事务。超时时钟会在事务启动的时候开始计时,所以只针对启动一个新事务的传播行为事务才有意义(PROPAGATION_NESTED,PROPAGATION_REQUIRES_NEW,PROPAGATION_REQUIRED)
回滚规则:
定义了事务如果运行失败的回滚策略,默认情况事务只有遇到运行期异常的时候才会回滚,遇到检查期异常不会回滚,但是通过设置回滚规则可以自定义回滚的策略
在XML定义事务:
增加命名空间配置:
xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
<tx:advice id="txAdvice"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* org.robbie.test.spring.beans.MyDao.*(..))"/> </aop:config>配置事务通知txAdvice,这个通知会拦截以save开头的方法,并启动REQUIRED事务,其余的所有方法指定SUPPORTS事务,值得注意的是tx:method中定义的事务属性说明如下:
相关推荐
Spring测试模块提供了全面的测试支持,包括对Spring应用程序上下文的加载、AOP代理的处理、事务管理以及对各种测试框架(如JUnit、TestNG)的集成。`org.springframework.test-3.0.2.RELEASE.jar`正是这个模块的实现...
6.Spring事务管理源码深度解析.mp4
spring事务_案例_PPT 一、事务传播机制的demo案例,内容包括: 1.业务代码列举7种事务传播机制的情况,...7.spring事务15种不生效的场景 8.事务的基本属性和常用的属性字段 三、压缩包有数据库和数据表,直接运行即可。
导致 `org.springframework.dao.InvalidDataAccessApiUsageException` 的主要原因是Spring事务管理器默认将事务设置为只读模式。这意味着,在默认情况下,Spring假设任何被事务管理的方法都是只进行读取操作而不涉及...
Java面试题54.Spring事务的传播特性和隔离级别.mp4
Spring中的事务管理问题:org.springframework.transaction-3.1.0.M1.jar包。org.springframework.transaction-3.1.0.M1.jar包。
Spring提供了声明式事务管理,允许开发者在配置文件中定义事务边界,而无需在业务逻辑代码中显式处理事务。这种方式既保持了代码的清晰,又实现了事务的统一管理。同时,Spring还支持编程式事务管理,适用于更复杂的...
总结来说,`org.springframework.web.jar`包含的Spring Web模块提供了丰富的功能,包括请求调度、MVC设计模式的支持、会话管理、异常处理以及与Spring其他模块(如数据访问、事务管理等)的无缝集成。这些特性使得...
Spring 2.5 实现事务管理(本地事务、分布式事务) Spring 框架提供了对事务管理的支持,它可以使得事务的管理变得更加简洁和灵活。事务管理是指在多个操作中维持一致性的机制,它可以确保在多个操作中,如果某个...
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
#### Spring事务控制的基础概念 Spring框架支持两种类型的事务管理:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过编码的方式来管理事务,适用于需要细粒度控制的情况。 - **声明式事务管理**:...
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
7. **org.springframework.orm-3.0.5.RELEASE.jar**: 提供了对流行ORM(对象关系映射)框架的集成,如Hibernate和JPA,使得在Spring应用中使用ORM变得更加简单。 8. **org.springframework.aop-3.0.5.RELEASE.jar...
7. **案例分析**:"SPRING事务管理案例分析.docx"很可能包含了具体的项目实例,详细讲解了如何在Spring项目中配置和使用事务管理,以及如何解决实践中遇到的问题。而"studyspring"可能是源代码目录,包含了实现这些...
Spring事务管理.pdf 1.资料 2.本地事务与分布式事务 3.编程式模型 4.宣告式模型
- **事务处理**:Spring提供了强大的事务管理功能,支持编程式和声明式事务管理。 - **事务隔离级别**:介绍了不同事务隔离级别的概念及其在Spring中的配置方式。 #### 10. 验证与类型转换 - **数据验证**:Spring...
7. `org.springframework.aop-3.1.1.RELEASE.jar`:Spring AOP(面向切面编程)模块,用于实现横切关注点,如日志、事务管理等,可以与 Spring AMQP 结合使用,提供事务性消息处理。 8. `cglib-nodep.jar`:CGLIB ...
Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一...
7.spring 属于低侵入式设计,代码的污染极低;8.独立于各种应用服务器;9.spring 的 DI 机制降低了业务对象替换的复杂性;10.Spring 的高度开放性,并不强制应用完全依赖于 Spring,开发者可以自由选择 spring 的...
java面试宝典