Spring事务管理

来源:互联网 发布:莱昂纳德防守知乎 编辑:程序博客网 时间:2024/06/16 08:42

事务控制概述

编程式事务控制

自己动手控制事务,叫做编程式事务控制
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);    }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝不喜欢奶粉的味道怎么办 四个月宝宝不喜欢吃奶粉怎么办 四岁宝宝有口臭怎么办 4个月宝宝口臭怎么办 2岁宝宝有口臭是怎么办 两岁宝宝有口气怎么办 2岁宝宝口气重是什么原因怎么办 两岁宝宝口气重怎么办 两岁宝宝有口臭怎么办 两岁身高不达标怎么办 两岁宝宝82厘米怎么办 2岁幼儿说话结巴怎么办 2岁的宝宝结巴怎么办 2岁半宝宝口吃怎么办 2周岁宝宝不说话怎么办 三周岁宝宝不说话怎么办 2周岁宝宝突然说话结巴怎么办 两周岁宝宝突然说话结巴怎么办 三周岁宝宝说话突然结巴怎么办 小孩g和d不分怎么办 两岁宝宝皮肤黑怎么办 2岁宝宝肤色偏黄怎么办 2岁宝宝迷上手机怎么办 2岁宝宝说话口吃怎么办 两岁宝宝突然口吃怎么办 两岁半的宝宝还不会说话怎么办 2岁宝宝自闭症怎么办呀 新生儿又吐又拉怎么办 一岁多宝宝受凉呕吐拉稀怎么办 7个月的宝宝腹泻怎么办 两岁宝宝拉稀水怎么办 2岁宝宝发烧呕吐怎么办 1岁宝宝着凉呕吐怎么办 2岁着凉了呕吐怎么办 2岁宝宝着凉呕吐怎么办 两岁宝宝偏矮怎么办 2岁宝贝吐没精神怎么办 11个月的宝宝吐怎么办 二岁的宝宝吐了怎么办 十个月小孩吐了怎么办 10个月宝宝呕吐怎么办