(不再跟新,markdown在移动端体验太差)spring , spring的事务管理 , 为什么要事务管理

事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。

这样可以防止出现脏数据,防止数据库数据出现问题。

开发中为了避免这种情况一般都会进行事务管理。

事务是针对数据库的增删改查的

在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。

Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。

Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。

1 Spring

Spring是于2003年兴起的一个轻量级的Java开发框架, 由Rod Johnson创建。Spring框架是一个分成架构. 它包含一系列的功能要素并被分为大约20个模块. 这些模块分为 Core Container, Data Access/Integration, Web , AOP(Aspect Oriented Programming), Insrumentation和测试部分.

Spring两大核心:

  1. IOC
  2. AOP

Spring优点:

  • 使用Spring可以方便解耦, 简化开发(高内聚低耦合):Spring就是一个大工厂(容器), 可以将所有对象创建和依赖关系维护,交给Spring管理. Spring工厂是用于生成bean

  • AOP编程的支持:Spring提供面向切面编程,可以方便的实现对程序进行权限拦截,运行监控等功能 (AOP:面向切面编程, 是Aspect Oriented Program的首字母缩写. 这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。)

    AOP是代理的体现,是通过动态代理机制实现的.

    AOP采用横向抽取机制. 底层运用动态代理.

    Spring AOP使用纯Java实现, 不需要专门的编译过程和类加载器, 在运行期通过代理方式向目标类织入增强代码. 利用AOP可以对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分之间的耦合度降低, 提高程序的可重用性, 同时提高了开发的效率.

使AOP注解生效的代码:

    <!-- 使aop注解生效 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

注: aspectj 是AOP框架

**AOP经典应用: 事务管理, 性能监视,  安全检查, 缓存,  日志等**

事务管理—要想给某些方法添加事务,只要找到方法,就能自动给它添加上了.
性能监视—测试某个方法它执行的一个时间
安全检查—在方法使用之前,对方法进行检测一下(比如:方法里面有一个用户,可以看这个用户是否登录)
日志—在你执行之后,对你所做的操作进行一个记录

  • 声明式事务的支持: 只需要通过配置就可以完成对事务的管理, 而无需手动编程
  • 方便程序的测试: Spring对Junit4支持, 可以通过注解方便的测试Spring程序

  • 方便集成各种优秀框架: Spring不排斥各种优秀的开源框架, 其内部提供了对各种优秀框架(如:struts,Hibernate,MyBatis,Quartz等)的直接支持

  • 降低javaEE API的使用难度: Spring对JavaEE开发中非常难用的一些API(JDBC,JavaMail,远程调用等), 都提供了封装, 使这些API应用难度大大降低.

2 初步理解

事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。 比如:银行转账.
在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。

事务有四个特性:ACID

    原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
    一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
    隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
    持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

3 核心接口

Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略。
Spring事务管理涉及的接口的联系如下:

3.1 事务管理器

Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。
Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。此接口的内容如下:

Public interface PlatformTransactionManager()...{  
    // 由TransactionDefinition得到TransactionStatus对象
    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 
    // 提交
    Void commit(TransactionStatus status) throws TransactionException;  
    // 回滚
    Void rollback(TransactionStatus status) throws TransactionException;  
} 

从这里可知具体的具体的事务管理机制对Spring来说是透明的,它并不关心那些,那些是对应各个平台需要关心的,所以Spring事务管理的一个优点就是为不同的事务API提供一致的编程模型,如JTA、JDBC、Hibernate、JPA。下面分别介绍各个平台框架实现事务管理的机制。

3.1.1 JDBC事务

如果应用程序中直接使用JDBC来进行持久化,DataSourceTransactionManager会为你处理事务边界。为了使用DataSourceTransactionManager,你需要使用如下的XML将其装配到应用程序的上下文定义中:

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

实际上,DataSourceTransactionManager是通过调用Java.sql.Connection来管理事务,而后者是通过DataSource获取到的。通过调用连接的commit()方法来提交事务,同样,事务失败则通过调用rollback()方法进行回滚。

3.1.2 Hibernate事务

如果应用程序的持久化是通过Hibernate实现的,那么你需要使用HibernateTransactionManager。对于Hibernate3,4,5,需要在Spring上下文定义中添加如下的声明:

    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

sessionFactory属性需要装配一个Hibernate的session工厂,HibernateTransactionManager的实现细节是它将事务管理的职责委托给org.hibernate.Transaction对象,而后者是从Hibernate Session中获取到的。当事务成功完成时,HibernateTransactionManager将会调用Transaction对象的commit()方法,反之,将会调用rollback()方法。

3.1.3 Java持久化API事务(JPA)

Hibernate多年来一直是事实上的Java持久化标准,但是现在Java持久化API作为真正的Java持久化标准进入大家的视野。如果你计划使用JPA的话,那你需要使用Spring的JpaTransactionManager来处理事务。你需要在Spring中这样配置JpaTransactionManager:

    <!-- 配置 entityManagerFactory-->
    <bean id=\"entityManagerFactory\" class=/"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean/">
        <property name="dataSource" ref="dataSource"></property>
        <!-- 配置jpa的具体实现 -->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
        </property>
        <!-- 配置扫描包,扫描所有带有jpa注解的类entity -->
        <property name="packagesToScan" value="com.qx.springdata"></property>

        <!-- 配置具体实现的相关配置 -->
        <property name="jpaProperties">
            <props>
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.format_sql">true</prop>
                    <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>

        </property>
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"></property>
    </bean>

JpaTransactionManager只需要装配一个JPA实体管理工厂(javax.persistence.EntityManagerFactory接口的任意实现)。JpaTransactionManager将与由工厂所产生的JPA EntityManager合作来构建事务。

注意:为JPA事务管理器注入entityManagerFactory的操作 所起的作用 就好比往hibernate事务管理器中注入sessionFactory

3.1.4 Java原生API事务

如果你没有使用以上所述的事务管理,或者是跨越了多个事务管理源(比如两个或者是多个不同的数据源),你就需要使用JtaTransactionManager:

    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManagerName" value="java:/TransactionManager" />
    </bean>

JtaTransactionManager将事务管理的责任委托给javax.transaction.UserTransaction和javax.transaction.TransactionManager对象,其中事务成功完成通过UserTransaction.commit()方法提交,事务失败通过UserTransaction.rollback()方法回滚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值