spring的事务管理

PlatformTransactionManager接口

        此接口是spring提供的平台事务管理器,主要用于事务管理。
该接口提供了3个事务操作的方法

返回类型方法作用
TransactionStatusgetTransaction ( TransactionDefinition definition )获取事务状态
voidcommit ( TransactionDefinition definition )提交事务
voidrollback( TransactionDefinition definition )回滚事务

注:方法1返回一个TransactionStatus类型的对象(一个事务),它被关联在当前执行的线程上

     PlatformTransactionManager 接口有许多不同的实现类,常见的几个实现类如下

  • org .springframework.jdbc.datasource.DataSourceTransactionManager: 用于配置 JDBC
    据源的事务管理器。
  • org .springframework.orm. hibernate4. HibernateTransactionManager :用于配 Hibernate
    的事务管理器
  • org .springframework. transaction .jta.Jta TransactionManager: 用于配置全局事务管
    理器

TransactionDefinìtion接口

        TransactionDefinition接口是事务定义(描述)的对象,该对象中定义了事务规则,并提供了获取事务相关信息的方法,具体如下

返回类型方法作用
StringgetName()获取事务对象名称
intgetlsolationLevel()获取事务的隔离级别
intgetPropagationBehavior()获取事务的传播行为
intgetTimeout()获取事务的超时时间
booleanisReadOnly()获取事务是否可读

事务传播行为的种类

TransactionStatus接口

        TransactionStatus 接口是事务的状态,它描述了某一时间点上事务的状态信息。该接口中包含 6个方法,具体如下

返回类型方法作用
voidflush()刷新事务
booleanhasSavepoint()获取是否存在保存点
booleanisCompleted()获取事务是否完成
booleanisNewTransaction()获取是否是新事务
booleanisRollbackOnly()获取事务是否回滚
voidsetRollbackOnly()设置事务回滚

事务管理的方式

编程式事务管理

编程式事务管理详解

声明式事务管理

        声明式事务是建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
        显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,它的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等


本节参考于:https://www.cnblogs.com/nnngu/p/8627662.html

基于xml的声明式事务例子

需要spring-tx.4.3.6.RELEASE和spring-aop.4.3.6.RELEASE包

applicationContext.xml
<?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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-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/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
   <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <!-- 数据库驱动 -->
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />

        <!-- 连接字符串 -->
        <property  name="url" value="jdbc:mysql://localhost:3306/emis" />

        <!-- 数据库用户名和密码 -->
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>

    <!-- 配置jdbc模板 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- ref引用上面的数据源 -->
            <property name="dataSource" ref="dataSource" />
    </bean>



    <!-- 定义id为crud的bean -->
    <bean id="crud" class="com.Crud" >
        <!-- 将jdbcTemplate注入到jdbcTemplate对象中 -->
        <property name="jdbcTemplate" ref="jdbcTemplate" />

    </bean>

    <!-- 声明事务管理器,依赖于数据源 -->
    <bean
            id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

    </bean>

    <!-- 基于xml的声明式事务 -->
    <tx:advice  id="txAdvice"
                transaction-manager="transactionManager">
        <tx:attributes>
            <!-- *表示任意方法 -->
            <tx:method name="*"
                       propagation="REQUIRED"
                       isolation="DEFAULT"
                       read-only="false" />
        </tx:attributes>
    </tx:advice>

    <!-- 声明式事务是建立在aop上的 -->
    <!--编写aop,自动对目标生成代理 ,aspectj框架-->
    <aop:config>
<!--  execution(* com.*.*(..))"-->
<!--                    第一个*的位置 表示返回类型 *代表所有返回类型-->
<!--                    第二个*的位置 表示类-->
<!--                    第三个*的位置 表示方法-->
<!--                    (..)表示方法的参数 ..代表任意参数-->
        <aop:pointcut  expression="execution(* com.*.*(..))"
                       id="txPointCut" />
        <!-- 切面 将切入点与通知整合 -->
        <aop:advisor  advice-ref="txAdvice"
                      pointcut-ref="txPointCut" />
    </aop:config>
</beans>
CrudDao接口
package com;

import java.util.List;

public interface CrudDao {
 
    public void transfer(String out,String in, double money);
}
CrudDao接口的实现类
public class Crud implements CrudDao{
   public void transfer(String out,String in, double money){
        jdbcTemplate.update("update account set money=money-? where username=?",money,out);
//
        jdbcTemplate.update("update account set money=money+? where username=?",money,in);

    }
 }

基于注解的声明式事务例子

只需要在执行事务的方法上添加如下注解

    //基于注解的声明式事务,这三个属性是tx:method里的属性
	@Transactional(propagation = Propagation.REQUIRED ,
	isolation = Isolation.DEFAULT , readOnly = false)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值