关于spring boot 事务

关于spring boot 事务

redis事务

  • redis最好的事务方式还是用它自己的watch 读数据,然后再用multi进行锁定,最后用exec执行,如果成功返回[null,true],如果失败返回操作结果[结果,false]
  • redis的事务很容易与mysql数据库的事务混在一起,尽量不要打开。默认redis的事务是关闭的。非要打开的可以 template.setEnableTransactionSupport(true);
  • 配置参考:

@Configuration

@EnableCaching

public class RedisConfig extends CachingConfigurerSupport {

    // slf4j logger

    private final static Logger logger = LoggerFactory.getLogger(RedisConfig.class);

    @Bean

    @Override

    public KeyGenerator keyGenerator() {

        logger.debug(“—–>>>>>[RedisConfig.keyGenerator]:Initializing Redis keyGenerator.”);

        return new KeyGenerator() {

            @Override

            public Object generate(Object target, Method method, Object… params) {

                StringBuilder sb = new StringBuilder();

                sb.append(target.getClass().getName());

                sb.append(method.getName());

                for (Object obj : params) {

                    sb.append(obj.toString());

                }

                return sb.toString();

            }

        };

    }

    @SuppressWarnings(“rawtypes”)

    @Bean

    public CacheManager cacheManager(RedisTemplate redisTemplate) {

        logger.debug(“—–>>>>>[RedisConfig.cacheManager]:Initializing simple Redis Cache manager.”);

        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);

        //todo 设置缓存过期时间

//        rcm.setDefaultExpiration(60 * 3);//秒

        return rcm;

    }

    /**

     * 不用理会 factory 警告!!!

     * todo 存对像时直接转成jsonString就行了,不需要用其它的序列化。

     *

     *

     * @param factory

     * @return

     */

    @Bean

    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {

        logger.debug(“—–>>>>>[RedisConfig.redisTemplate]:Initializing Redis Template.”);

        StringRedisTemplate template = new StringRedisTemplate(factory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();

        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(om);

        template.setValueSerializer(jackson2JsonRedisSerializer);

        template.afterPropertiesSet();

        return template;

    }

}

参考:

http://stackoverflow.com/questions/21664487/how-to-implement-transaction-in-spring-data-redis-in-a-clean-way

spring (boot)事务

spring 的事务主要用@Transactional注解。

有几点要特别注意:

  1. 指定rollbackFor参数,这个是显示指定回滚的条件,如rollbackFor = Exception.class,当方法抛异常时回滚,非常实用。
  2. 注意@Transactional只能作用在public的方法上
  3. @Transactional书写方便,尽可能写在最需要的地方,如某个方法上,而不是在整个类上
  4. 配置参考

@Configuration

@EnableTransactionManagement

@PropertySource(“classpath:/application-database-${spring.profiles.active}.properties”)

public class MyBatisConfig {

//    @Bean(name = “dataSource”) //!!!返回参数要是类,不是接口,否则它处无法使用!!!

//    @ConfigurationProperties(prefix = “spring.datasource”)

//    public DruidDataSource dataSource() throws SQLException {

//        return new DruidDataSource();

//    }

    /**

     * 直接使用properties里面的配置生成datasource

     */

    @Autowired

    private DataSource dataSource;

    @Bean

    public SqlSessionFactory sqlSessionFactory() throws Exception {

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

        sqlSessionFactoryBean.setDataSource(dataSource);

        //mybatis分页

        PageHelper pageHelper = new PageHelper();

        Properties props = new Properties();

        props.setProperty(“dialect”, “mysql”);

        props.setProperty(“reasonable”, “true”);

        props.setProperty(“supportMethodsArguments”, “true”);

        props.setProperty(“returnPageInfo”, “check”);

        props.setProperty(“params”, “count=countSql”);

        pageHelper.setProperties(props); //添加插件

        sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper});

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        sqlSessionFactoryBean.setMapperLocations(resolver.getResources(“classpath:*/mybatis/*.xml”));

        return sqlSessionFactoryBean.getObject();

    }

    @Bean(name = “transactionManager”)

    public PlatformTransactionManager transactionManager() throws SQLException {

        return new DataSourceTransactionManager(dataSource);

    }

}

@EnableTransactionManagement 只需要这里指定一次就行了,其它地方不需要再指定,引用的时候自然会打开事务。

参考:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/index.html#transaction-declarative-attransactional-settings

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100424.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 三、VHDL语言基础[通俗易懂]

    三、VHDL语言基础[通俗易懂]正文:1VHDL简介VHDL的全称为VHSIC硬件描述语言(VHSICHardwareDescriptionLanguage),VHSIC:VeryHighSpeedIntegra

    2022年7月2日
    22
  • 《python语言程序设计》_第4章_选择[通俗易懂]

    《python语言程序设计》_第4章_选择[通俗易懂]第四章#4.1引言布尔表达式:选择语句选择的条件。程序:importmath#加载math模块radius=eval(input("Enteraninteger:&quo

    2022年7月6日
    19
  • jvm触发full gc条件(Linux内存管理机制)

    1、Java垃圾回收机制GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从gcroot开始,把所有可以搜索得到的对象标记为存活对象。缺点就是:1.有可能不知不…

    2022年4月12日
    78
  • Python中的三目表达式

    Python中的三目表达式Python中的三目表达式一般C系列语言,例如C#,三目运算都是“?:”的结构。例如:res=(i>j?true:false);但是在python中,使用的是if-else来实现的res=Trueifi>jelse2;#如果条件为真的话,那么结果为前者,否则为后者

    2022年10月27日
    0
  • 5G Wifi频段及信道介绍[通俗易懂]

    5G Wifi频段及信道介绍[通俗易懂]5GWifi频段及信道介绍WiFi三频AP规划信道时,建议分别采用2.4G、5.2G、5.8G频段可用信道。2.4G频段;5.2G频段;5.8G频段。中国5GWiFi频段5.8GHz频段,中国开放只有149、153、157、161、165这5个信道;其中可支持一组80MHz信道捆绑(149-161)或两组40MHz捆绑(149-153和157-161);所以165信道支持…

    2022年6月7日
    1.2K
  • mysql如何优化慢查询_慢sql优化思路

    mysql如何优化慢查询_慢sql优化思路这篇文章主要是就在公司实习的时候,对SQL优化工作作出的一些整理。  在公司实习的时候,导师分配了SQL慢查询优化的任务,任务是这样的:每周从平台中导出生产数据库的慢查询文件进行分析。进行SQL优化的手段也主要是修改SQL写法,或者新增索引。  现在从记录项目中的一点点做起。  (1)数据库中设置SQL慢查询    一、第一步.开启mysql慢查询     方…

    2022年10月15日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号