Spring如何管理事务(声明式事务的两种方式XML和注解)

Spring管理事务对象

  • PlatformTransactionManager 平台事务管理器

    • commit
    • rollback
  • TransactionDefinition 事务定义

    • 描述了事务基本信息
  • TansactionSatus(状态设计模式)

    • 描述事务状态

声明式事务

  • 去除了通知类的编写
    • 使用xml中的tx:advice标签,替换原本自己写的通知类
  • 单独控制某些方法的事务属性
    • tx:attributes
  • 编写aop相关配置完成通知和具体方法的关系

流程

1.注入DataSourceTranscationManager数据源事务管理到IOC容器中,需要提供数据库的链接信息

<!--1.配置数据库事务管理对象-->
    <bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

2.创建通知类对象(因为通知类是平台事务管理器需要管理事务,所以将数据库事务管理,传入到本类中)

<!--2.配置通知类,通知类已经由Spring提供好了,直接使用注入事务管理对象即可-->
    <tx:advice id="txAdvice" transaction-manager="tx">
        <tx:attributes>
            <!--所有方法都有读写功能-->
            <tx:method name="*" read-only="false"/>
            <!--再次进行过滤,如果是find开头的方法,就只能查询-->
            <tx:method name="find*" read-only="true"/>
        </tx:attributes>
    </tx:advice>

3.配置AOP

​ 1.设置切入点

​ 2.创建切面(通知类中只有一个方法,所以这里不用method属性,直接写的通知类对象)

<!--3.开启AOP-->
    <aop:config>
        <aop:pointcut id="pt" expression="execution(* com.itheima.service..find*(..))"/>
        <!--配置切面-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
    </aop:config>

tx-method属性

  • name :指定需要操作的方法名字,可以使用通配符
  • read-only:是否只读事务
  • isolation:隔离级别(一般情况默认,跟着数据库走)

事务传播行为

  • 需要
    • REQUIREW(需要)
    • REQUIREW_NEW(需要新的事务)
  • 支持
    • supports(支持) 有事务跟着事务走,没有事务也可以
    • not_supported,不支持
  • 强制
    • mandatory,必须要求事务
    • never,必须不能有

注解格式事务

  1. 事务管理器还是需要在xml中配置上

    <!--1.配置数据库事务管理对象-->
        <bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
  2. 开启注解驱动,将上面定义的数据库事务管理,传入到驱动中

    <tx:annotation-driven transaction-manager="tx" />
    
  3. 在方法上加上@Transactional注解即可

    1. 一般写在方法上
    @Transactional
    public interface AccountService {
        //测试连接
        @Transactional
        List<Account> findAll();
    }
    

纯注解事务

  • 使用EnableTransactionManagerment开启注解支持
    • 写在配置类上
  • 利用注解形式配置TransactionManager
  • 在JDBCCfonig的类类中,添PlatformTransactionManager对象的Bean

redis整合Spring

使用

  • opsForvalue, String
  • opsForHas,Hash
  • opsForList,List
  • opsForSet,Set

配置文件

package com.itheima.config;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@PropertySource("redis.properties")
public class RedisConfig {

    @Value("${redis.host}")
    private String hostName;

    @Value("${redis.port}")
    private Integer port;

//    @Value("${redis.password}")
//    private String password;

    @Value("${redis.maxActive}")
    private Integer maxActive;
    @Value("${redis.minIdle}")
    private Integer minIdle;
    @Value("${redis.maxIdle}")
    private Integer maxIdle;
    @Value("${redis.maxWait}")
    private Integer maxWait;



    @Bean
    //配置RedisTemplate
    public RedisTemplate createRedisTemplate(RedisConnectionFactory redisConnectionFactory){
        //1.创建对象
        RedisTemplate redisTemplate = new RedisTemplate();
        //2.设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //3.设置redis生成的key的序列化器,对key编码进行处理
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        //4.返回
        return redisTemplate;
    }

    @Bean
    //配置Redis连接工厂
    public RedisConnectionFactory createRedisConnectionFactory(RedisStandaloneConfiguration redisStandaloneConfiguration,GenericObjectPoolConfig genericObjectPoolConfig){
        //1.创建配置构建器,它是基于池的思想管理Jedis连接的
        JedisClientConfiguration.JedisPoolingClientConfigurationBuilder builder = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder)JedisClientConfiguration.builder();
        //2.设置池的配置信息对象
        builder.poolConfig(genericObjectPoolConfig);
        //3.创建Jedis连接工厂
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration,builder.build());
        //4.返回
        return jedisConnectionFactory;
    }

    @Bean
    //配置spring提供的Redis连接池信息
    public GenericObjectPoolConfig createGenericObjectPoolConfig(){
        //1.创建Jedis连接池的配置对象
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        //2.设置连接池信息
        genericObjectPoolConfig.setMaxTotal(maxActive);
        genericObjectPoolConfig.setMinIdle(minIdle);
        genericObjectPoolConfig.setMaxIdle(maxIdle);
        genericObjectPoolConfig.setMaxWaitMillis(maxWait);
        //3.返回
        return genericObjectPoolConfig;
    }


    @Bean
    //配置Redis标准连接配置对象
    public RedisStandaloneConfiguration createRedisStandaloneConfiguration(){
        //1.创建Redis服务器配置信息对象
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        //2.设置Redis服务器地址,端口和密码(如果有密码的话)
        redisStandaloneConfiguration.setHostName(hostName);
        redisStandaloneConfiguration.setPort(port);
//        redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
        //3.返回
        return redisStandaloneConfiguration;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值