spring中的事务管理(一)

spring中的事务管理(一)


        作为企业级应用程序框架,Spring 在不同的事务管理 API 之上定义了一个抽象层.而应用程序开发人员不必了解底层的事务管理 API, 就可以使用Spring 的事务管理机制.

 

编程式事务管理

使用原生的JDBC API进行事务管理

1.获取数据库连接Connection对象

2.取消事务的自动提交

3.执行操作

4.正常完成操作时手动提交事务

5.执行失败时回滚事务

6.关闭相关资源

 

Spring 既支持编程式事务管理, 也支持声明式的事务管理.

编程式事务管理: 将事务管理代码嵌入到业务方法中来控制事务的提交和回滚. 在编程式管理事务时, 必须在每个事务操作中包含额外的事务管理代码.

声明式事务管理: 大多数情况下比编程式事务管理更好用. 它将事务管理代码从业务方法中分离出来, 以声明的方式来实现事务管理. 事务管理作为一种横切关注点, 可以通过 AOP 方法模块化. Spring 通过 Spring AOP 框架支持声明式事务管理.

 

Spring 从不同的事务管理 API 中抽象了一整套的事务机制. 开发人员不必了解底层的事务 API, 就可以利用这些事务机制. 有了这些事务机制, 事务管理代码就能独立于特定的事务技术了.

Spring 的核心事务管理抽象是interface PlatformTransactionManager它为事务管理封装了一组独立于技术的方法. 无论使用 Spring 的哪种事务管理策略(编程式或声明式), 事务管理器都是必须的.

 

Spring中的事务管理器的不同实现

DataSourceTransactionManager:在应用程序中只需要处理一个数据源, 而且通过 JDBC 存取

JtaTransactionManager:在 JavaEE 应用服务器上用 JTA(Java Transaction API) 进行事务管理

HibernateTransactionManager:用 Hibernate 框架存取数据库

……

事务管理器以普通的 Bean 形式声明在 Spring IOC 容器中

 

 

用 @Transactional 注解声明式地管理事务

除了在带有切入点, 通知和增强器的 Bean 配置文件中声明事务外, Spring 还允许简单地用 @Transactional 注解来标注事务方法.

为了将方法定义为支持事务处理的,可以为方法添加 @Transactional 注解. 根据 Spring AOP 基于代理机制, 只能标注公有方法.

可以在方法或者类级别上添加@Transactional 注解. 当把这个注解应用到类上时,这个类中的所有公共方法都会被定义成支持事务处理的.

在 Bean 配置文件中只需要启用 <tx:annotation-driven> 元素, 并为之指定事务管理器就可以了.

 

如果事务处理器的名称是transactionManager, 就可以在<tx:annotation-driven> 元素中省略 transaction-manager 属性. 这个元素会自动检测该名称的事务处理器.

 

<!-- 配置事务管理器 -->

    <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <!--设置数据源 -->

        <propertyname="dataSource"ref="dataSource"></property>

    </bean>

   

    <!--启用事务的注解支持 -->

    <!--如果事务管理器的id属性值是transactionManager,transaction-manager属性就可以省略 -->

    <tx:annotation-driven/>

 

 

 

 

用事务通知声明式地管理事务(xml)

<!-- 配置事务管理器 -->

    <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <propertyname="dataSource"ref="dataSource"></property>

    </bean>

   

    <!--配置事务 -->

    <tx:adviceid="txAdvice">

        <!--配置添加事务的方法 -->

        <tx:attributes>

              <!--给具体的方法添加事务 -->

            <tx:methodname="test"propagation="REQUIRED"/>

            <!--给查询的方法添加事务 -->

            <tx:methodname="get*"read-only="true"/>

            <!--给所有的方法添加事务 -->

            <tx:methodname="*"/>

        </tx:attributes>

    </tx:advice>

    <!--配置中AOP -->

    <aop:config>

        <!--配置切入点表达式 -->

        <aop:pointcutexpression="execution(* com.atguigu.service.*.*(..))"

                id="pointCut"/>

        <!--将添加的方法与切入点表达式关联 起来 -->

        <aop:advisoradvice-ref="txAdvice"pointcut-ref="pointCut"/>

    </aop:config>

 

猜你喜欢

转载自blog.csdn.net/dl0246/article/details/78609472