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,必须不能有
注解格式事务
-
事务管理器还是需要在xml中配置上
<!--1.配置数据库事务管理对象--> <bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
-
开启注解驱动,将上面定义的数据库事务管理,传入到驱动中
<tx:annotation-driven transaction-manager="tx" />
-
在方法上加上@Transactional注解即可
- 一般写在方法上
@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;
}
}