关于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)
上一篇 2021年5月12日 上午10:00
下一篇 2021年5月12日 上午11:00


相关推荐

  • java高并发详解

    java高并发详解转载地址:https://www.cnblogs.com/lr393993507/p/5909804.html&nbsp;&nbsp;对于开发的网站,如果网站的访问量非常大,那么我们应该考虑相关的、并发访问问题,并发是绝大部分程序员头疼的问题;为了更好的理解并发和同步,先明白两个重要的概念:异步和同步;&nbsp;1、同步和异…

    2022年5月19日
    33
  • 国产AI又出王炸,碾压Manus?实测天工超级智能体6大实用场景,居然还能这么玩!

    国产AI又出王炸,碾压Manus?实测天工超级智能体6大实用场景,居然还能这么玩!

    2026年3月15日
    2
  • eclipse导入java文件_eclipse如何导入java项目文件

    eclipse导入java文件_eclipse如何导入java项目文件平时下载到项目时 希望能够导入到 eclipse 中使用 但有些项目不能直接导入 需要做转换 打开源文件目录 查询如下 如果目录中包含 pom xml 文件 则说明该项目由 Maven 构建的 参考以下如何导入 Maven 项目 如果目录中包含 build xml 文件 那么说明这个项目是由 ant 构建的 参考以下如何导入 ant 项目 如果目录中包含 classpath project 文件 那么说明这个项目由 ecli

    2026年3月16日
    1
  • vscode自动生成html模板_vscode html插件

    vscode自动生成html模板_vscode html插件初学vue,不熟练使用vscode。发现vscode不能新建文件夹,必须从外部建好之后,在文件–打开文件夹中打开。然后在资源管理器中就可以新建文件或者文件夹了。新建文件后缀写html格式,则就是html文件。然后输入英文的!+tab键即可,或者是输入html:5+tab键。…

    2022年8月21日
    13
  • 新手小白学JAVA IO流 File 字节流 字符流

    新手小白学JAVA IO流 File 字节流 字符流IO简介1流Stream在学习IO流之前,我们首先需要学习的概念就是Stream流为了方便理解,我们可以把数据的读写操作抽象成数据在”管道”中流动,但需注意:1.流只能单方向流动2.输入流用来读取→in3.输出流用来写出→out4.数据只能从头到尾顺序的读写一次所以以程序的角度来思考,In/out相对于程序而言的输入(读取)/输出(写出)的过程.2IO流的继承结构在java中,根据处理的数据单位不同,可以把流分为字节流和字符流字节流:针对二进制文件字符流:针对

    2022年4月29日
    104
  • 基于Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 前言 本项目不仅仅是一个开发架构,而是努力打造一套从 前端模板 – 基础框…

    2021年6月23日
    101

发表回复

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

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