关于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 浅谈路径规划算法_rrt路径规划算法

    浅谈路径规划算法_rrt路径规划算法原文地址:http://theory.stanford.edu/~amitp/GameProgramming/1导言1.1算法1.2Dijkstra算法与最佳优先搜索1.3A*算法2启发式算法2.1A*对启发式函数的使用2.2速度还是精确度?2.3衡量单位2.4精确的启发式函数2.4.1预计算的精确启发式函数2.4.2线性精

    2022年8月23日
    3
  • redis 主从架构(sizeof函数怎么计算)

    一.绪论   Redis的复制功能是基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生。   当Slave启动并连接到Master之后,它将主动发送一个SYNC命令(首先Master会启动一个后台进程,将数据快照保存到文件中[rdb文件]Master会…

    2022年4月12日
    33
  • 在anaconda中安装pycharm_anaconda和pycharm关联

    在anaconda中安装pycharm_anaconda和pycharm关联经历了装软件的头疼阶段后,终于搞明白Anaconda,python,Pycharm之间的关系及各种python包的安装了一、Anaconda,python,Pycharm1、如果要使用python进行深度学习的话首先需要一个开发环境,说白了就是编python程序的一个软件,这个一般选pycharm比较方便。2、接着需要在pycharm中加载一个python的编译器,这个时候安装一个python即可,网上搜【python安装教程】会有很多。3、也可以安装Anaconda然后pycharm里的编译器选

    2022年8月29日
    1
  • 基于Eclipse的Android开发环境搭建「建议收藏」

    基于Eclipse的Android开发环境搭建「建议收藏」对于才接触Android开发的人员来说,复杂的开发环境搭建,各种新知识,新内容要接触总是让人无从下手。通过这篇文章,让零基础开发人员成功搭建基于Eclipse的android开发环境。Android使用Java语言进行开发,首先我们需要搭建Java开发环境,在此基础上搭建Android开发环境。如果开发者有Java开发经验,并有基于Eclipse的Java开发环境,可以跳过Java开发环境搭建。

    2022年7月23日
    10
  • mysql的tinyint范围

    mysql的tinyint范围createtabletest( idbigint(20)notnull, user_typetinyint(4)notnull;)以上建表方式:user_type值为[-128,127]中的整数createtabletest( idbigint(20)notnull, user_typetinyint(4)unsignednotnull;)…

    2022年9月21日
    0
  • df 命令详解「建议收藏」

    df 命令详解「建议收藏」df命令是用来查看linux系统服务器文件系统的磁盘使用情况。可以用该命令来查看已经使用了多少空间,还有多少空间可用。       df命令格式为df[选线][文件名]       df命令功能:显示指定磁盘文件的使用情况。如果没有指定文件,则显示所有挂载的文件系统的磁盘使用情况      选项可以有            -a:全部文件系统列表,包含虚拟文件系统

    2022年4月20日
    72

发表回复

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

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