• 暂时停更一段时间!
  • 近期网站将陆续进行前端页面改造!
  • 招募网站编辑,联系站长!

Spring事务管理之编程式事务管理和声明式事务管理

文章目录[隐藏]

编程式事务实现方式

模板事务(Transaction Template)的方式

– 此为Spring官方团队推荐的编程式事务管理方式

– 主要工具为 Jdbc Template 类

平台事务管理器(Platform Transaction Manager)方式

– 类似应用 JTA UserTransaction API 方式,但异常处理更简洁

– 核心类为:Spring事务管理的三个接口类以及 Jdbc template 类。辅助类为:TransactionDefinition 和 TransactionStatus

编程式事务实现案例

模板事务(Transaction Template)案例

– 步骤:获取模板对象,选择事务结果类型,业务数据操作处理

平台事务管理器(Platform Transaction Manager)案例

– 步骤:获取事务管理器;获取事务属性对象;获取事务状态对象;创建 JDBC 模板对象;业务数据操作处理。

编程事务总结

需要有效的数据源,具体数据源根据实际情况创建。

创建编程事务管理对象:

– 事务模板(Transaction Template)

– 事务管理器(plateform Transaction Manager)

业务逻辑处理

-基于 JdbcTemplate 完成业务处理

声明式事务实现原理

基于 AOP 模式机制,对方法前后进行拦截。

声明式事务实现方式

声明式事务管理的配置类型:

– 5 种类型:独立代理;共享代理;拦截器;tx 拦截器;全注释。(前三类 2.0 版本后不推荐使用)

声明式事务管理配置实现方式:

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    http://www.springframework.org/schema/tx     
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

    <!-- 引入数据库连接属性配置文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:database.properties" />
    </bean>
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"  destroy-method="close">
        <property name="driverClassName" value="${driver}" />
		<property name="url" value="${url}" />
		<property name="username" value="${username}" />
		<property name="password" value="${password}" />
    </bean>
	<!-- 配置数据源 -->  
	<!-- #DBCP 数据库连接池配置属性详细内容可参考官网描述:
       #http://commons.apache.org/proper/commons-dbcp/configuration.html 
       -->
    <!--<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="com.mysql.jdbc.Driver" />
        <property name="username" value="root" />
        <property name="password" value="mysql" />
        <!– 初始化连接大小 –>
        <property name="initialSize" value="5"></property>
        <!– 连接池最大空闲 –>
        <property name="maxIdle" value="3"></property>
        <!– 连接池最小空闲 –>
        <property name="minIdle" value="2"></property>
    </bean>-->
      
    <!-- jdbc 事务管理器 -->  
    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />
    </bean>  
    <!--事务模板 -->
    <!-- 2、注释模式事务:启动使用注解实现声明式事务管理的支持   -->
    <tx:annotation-driven transaction-manager="txManager" />
    <!-- 想创建的服务对象:this is the service object that we want to make transactional -->
    <bean id="fooService" class="com.jikewenku.service.DefaultFooService"/>
    <bean id="xbeanService" class="com.jikewenku.service.XbeanServiceImpl"/>
    <!-- 1、通过事务通知的模式实现事务
    事务通知:the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <!-- the transactional semantics... -->
        <tx:attributes>
            <!-- 以 get 开头的所有方法都为只读事务:all methods starting with 'get' are read-only -->
            <tx:method name="get*" read-only="true"/>
            <!-- 其它方法使用默认事务设置:other methods use the default transaction settings (see below) -->
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    <!-- 确保上述事务通知对定义在 FooService 接口中的方法都起作用(
    ensure that the above transactional advice runs for any execution
    of an operation defined by the FooService interface) -->
    <aop:config>
        <aop:pointcut id="fooServiceOperation" expression="execution(* com.jikewenku.service.FooService.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
    </aop:config>
</beans>  

编程事务管理和声明式事务管理区别

编程式事务运行用户在代码中精确定义事务的边界

声明式事务有助于用户将操作与事务规则进行解耦

– 基于 AOP 交由Spring容器实现

– 实现关注点聚焦在业务逻辑上

概括而言:

– 编程式事务侵入到业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于 AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。

两种事务的选择

小型应用,事务操作少:

– 建议编程式事务管理实现:Transaction Template

– 简单、显示操作、直观明显、可以设置事务名称

大型应用、事务操作多:

– 业务复杂度高、关联性紧密,建议声明式事务管理实现

– 关注点聚焦到业务层面,实现业务和事务的解耦

通用事务问题的解决方案

事务管理器类型:

– 基于不同的数据源选择对应的事务管理器

– 选择正确的 Platform Transaction Manager 实现类

– 全局事务的选择:Jta Transaction Manager


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Spring 事务管理之编程式事务管理和声明式事务管理
喜欢 (0)
[247507792@qq.com]
分享 (0)

邀请您免费 注册账号 登录 即可参与讨论!