spring的事务控制--关于事务控制的API和spring的事务控制配置

spring的事务控制

一. SpringJDBC使用

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发 , 使用非常简单, .

基本使用步骤如下 :

  1. 导入jar包

  2. 创建JdbcTemplate对象。依赖于数据源DataSource

  3. 调用JdbcTemplate的方法来完成CRUD的操作

    • update():执行DML语句。增、删、改语句
    • queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
      • 注意:这个方法查询的结果集长度只能是1
    • queryForList():查询结果将结果集封装为list集合
      • 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
    • query():查询结果,将结果封装为JavaBean对象
      • query的参数:RowMapper
        • 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
        • new BeanPropertyRowMapper<类型>(类型.class)
    • queryForObject:查询结果,将结果封装为对象
      • 一般用于聚合函数的查询

二. Spring声明式事物控制

1.事务控制的API介绍

PlatformTransactionManager接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法.

//获取事务状态信息
  TransactionStatus getTransaction(TransactionDefinition defition)
//提交事务
  void commit(TransactionStatus status)
//回滚事务
  void rollback(TransactionStatus status)

常用的实现类:

`org.springframework.jdbc.datasource.DataSourceTransactionManager` 使用Spring JDBC或iBatis 进行持久化数据时使用

`org.springframework.orm.hibernate5.HibernateTransactionManager` 使用Hibernate版本进行持久化数据时使用

TransactionDefinition

描述的是事务的定义信息对象,里面有如下方法:
在这里插入图片描述

TransactionStatus

此接口提供的是事务具体的运行状态,方法介绍如下图
在这里插入图片描述

2.事物的隔离级别

在这里插入图片描述

3.事物的传播行为

事务的传播行为:它解决的是两个被事务管理的方法互相调用问题。它与数据库没关系,是程序内部维护的问题。

REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)

SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)

MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常 REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。

NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

NEVER:以非事务方式运行,如果当前存在事务,抛出异常 NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。

三.声明式事务控制实现

1.配置事务步骤
1. 配置事务管理器
2. 配置事务的通知:此时我们需要导入事务的约束 tx名称空间和约束,同时也需要aop的名称空间和约束
       tx:advice标签配置事务通知:
            属性:
                id:给事务通知起一个唯一标识
                transaction-manager:给事务通知提供一个事务管理器引用
3. 配置AOP中的通用切入点表达式
4. 建立事务通知和切入点表达式的对应关系
5. 配置事务的属性:在事务的通知tx:advice标签的内部
2. 配置声明式事务控制

    <!--加载属性文件-->
    <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>

    <!--配置dao-->
    <bean id="accountDao" class="com.boke.dao.impl.AccountDaoImpl">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--配置service-->
    <bean id="accountService" class="com.boke.service.impl.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"></property>
    </bean>

    <!--配置数据源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

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

    <!--配置事务通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!--配置事务的属性
            isolation:用于指定事务的隔离级别,默认值为DEFAULT,表示使用数据库默认隔离级别
            propagation:用于指定事务的传播行为,默认值为REQUIRED,表示一定会有事务,增删改的选择,
                         查询选择SUPPORTS
            read-only:用于指定事务是否只读,布尔值,只有查询方法才能设为true,默认值为false表示读写
            timeout:用于指定事务的超时时间,默认值为-1表示永不超时,如果指定数值,以秒为单位
            rollback-for:用于指定一个异常,当产生该异常时事务回滚,产生其他异常时事务不回滚。
                          没有默认值,表示产生任何异常都回滚
            no-rollback-for:用于指定一个异常,当产生该异常时事务不回滚,产生其他异常时事务回滚。
                            没有默认值,表示任何异常都回滚
        -->
        <tx:attributes>
            <!--此配置意思为:当以get/find开头的方法支持事务,且该事务为只读-->
            <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="find*" propagation="REQUIRED" read-only="true"/>

            <!--此配置意思为:当以update,del,delete,insert,add,save开头的方法进行事务控制,会回滚-->
            <tx:method name="updaet*" propagation="REQUIRED"></tx:method>
            <tx:method name="del*" propagation="REQUIRED"></tx:method>
            <tx:method name="delete*" propagation="REQUIRED"></tx:method>
            <tx:method name="insert*" propagation="REQUIRED"></tx:method>
            <tx:method name="add*" propagation="REQUIRED"></tx:method>
            <tx:method name="save*" propagation="REQUIRED"></tx:method>
        </tx:attributes>
    </tx:advice>

    <!--配置AOP-->
    <aop:config>
        <!--配置切入点,也就是事务控制要在哪一层上,一般事务在业务层控制-->
        <aop:pointcut id="txPointCut" expression="execution(* com.boke.service.impl.*.*(..))"></aop:pointcut>
        <!--建立切入点表达式和事务通知之间的关系-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"></aop:advisor>
    </aop:config>

3.注解式配置

    <!--配置spring基于注解的事务管理器
      1、配置事务管理器
      2、开启spring对注解事务的支持
      3、在需要使用事务的类上使用@Transactional注解
    -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--开启spring对注解事务的支持-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

</beans>
ce" ref="dataSource"></property>
    </bean>

    <!--开启spring对注解事务的支持-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

</beans>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值