步骤
1. 开启数据库事务
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 -->
<property name="connectionTimeout" value="10000" />
<!-- 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
<property name="idleTimeout" value="600000" />
<!-- 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) -->
<property name="maxLifetime" value="60000" />
<!-- 连接池中允许的最大连接数。缺省值:10;推荐的公式: -->
<property name="maximumPoolSize" value="10" />
<property name="dataSourceProperties">
<props>
<prop key="cachePrepStmts">true</prop>
<prop key="prepStmtCacheSize">250</prop>
<prop key="prepStmtCacheSqlLimit">2048</prop>
<prop key="useServerPrepStmts">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice"
transaction-manager="transactionManager"><!-- transactionManager -->
<tx:attributes>
<!-- 指定相关方法才开启事务 -->
<tx:method name="save*" />
<tx:method name="update*" />
<tx:method name="delete*" />
</tx:attributes>
</tx:advice>
<!-- 切入点指明在所有方法产生事务时的拦截操作,这里只拦截业务逻辑层 -->
<aop:config>
<aop:pointcut id="serviceMethods"
expression="execution(* *..service*..*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="serviceMethods" order="0" />
</aop:config>
2 redisTemplate开启事务支持
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setValueSerializer(createJackson2JsonRedisSerializer());
template.setEnableTransactionSupport(true);
redis事务生效