Spring事务管理

12 篇文章 0 订阅
5 篇文章 0 订阅

事务控制概述

编程式事务控制

自己动手控制事务,叫做编程式事务控制
jdbc代码:

 Conn.setAutoCommite(false);     //设置手动控制事务

Hibernate代码

session.beginTransaction();    // 开启事务

【细粒度事务控制:可以对指定的方法,指定的方法中某几行添加事务控制】

声明式事务管理

spring的事务管理
只需要在配置文件中配置,事务应该在Service层统一控制。
spring提供了对事务控制的实现。用户如果想用Spring的声明式事务管理,只需要在配置文件中配置即可; 不想使用时直接移除配置。这个实现了对事务控制的最大程度的解耦。
spring提供事务管理,核心实现就是基于AOP.
【粗粒度的事务管理,不可以对方法的某几行应用事务管理】

Spring声明式事务管理器类:

jdbc技术:DataSourceTransactionManager
hibernate技术:HibernateTransactionManager

步骤

  • 引入jar包spring-core 和spring-jdbc
  • 加入名称空间aop
    引入名称空间tx
    (注意名称空间在spring源码的文档中找)

1、XML方式实现事务管理

1)、配置事务管理器类DataSourceTransactionManager

2)、配置事务增强<tx:advice >,需要引入事务管理名称空间tx

3)、AOP配置。配置切入点表达式,表示拦截哪些方法,然后在指定方法加入事务管理

<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>

     <!-- spring 声明式事务管理配置 -->
     <!-- 1.配置事务管理器类 -->
     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="dataSource"></property>
     </bean>   
     <!-- 2.配置事务增强 -->
     <tx:advice id="txAdvice" transaction-manager="txManager">
          <tx:attributes>
              <tx:method name="get*" read-only="true"/>
              <tx:method name="find*" read-only="true"/>
              <tx:method name="*" read-only="false"/>
          </tx:attributes>
     </tx:advice>
     <!-- AOP 配置拦截哪些方法(切入点表达式) -->
     <aop:config>
          <aop:pointcut expression="execution(* com.wsk.a_tx.DeptService.*(..))" id="pt"/>
          <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
     </aop:config>

2、注解方式实现事务管理

步骤:

1) 必须引入Aop相关的jar文件

2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类

3)在需要添加事务控制的地方,写上: @Transactional

@Transactional注解:
1)应用事务的注解
2)定义到方法上: 当前方法应用spring的声明式事务
3)定义到类上: 当前类的所有的方法都应用Spring声明式事务管理;
4)定义到父类上: 当执行父类的方法时候应用事务。

<!-- 数据源对象 -->
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
          <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
          <property name="jdbcUrl" value="jdbc:mysql:///day15"></property>
          <property name="user" value="root"></property>
          <property name="password" value="root"></property>
          <property name="initialPoolSize" value="3"></property>
          <property name="maxPoolSize" value="10"></property>
          <property name="maxStatements" value="100"></property>
          <property name="acquireIncrement" value="2"></property>
     </bean>

     <!-- JdbcTemplate 工具类实例 -->
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
          <property name="dataSource" ref="dataSource"></property>
     </bean>

     <!-- 事务管理器类 -->
     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="dataSource"></property>
     </bean>

     <!-- 开启注解扫描 -->
     <context:component-scan base-package="com.wsk.b_anno_tx"></context:component-scan>
     <!-- 注解方式实现事务 -->
     <tx:annotation-driven transaction-manager="txManager"/>

3.事务属性

@Transactional(
            readOnly = false,  // 读写事务
            timeout = -1,       // 事务的超时时间不限制
            noRollbackFor = ArithmeticException.class,  // 遇到数学异常不回滚
            isolation = Isolation.DEFAULT,              // 事务的隔离级别,数据库的默认
            propagation = Propagation.REQUIRED          // 事务的传播行为
    )
    public void save(Dept dept){
        deptDao.save(dept);
        int i = 1/0;
        deptDao.save(dept);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值