开发者社区> 问答> 正文

seata集成mybatis或者tkmybatis问题本地事物和全局事务冲突

  1. 本地@transactional事务开启 mapper.insertSelective(Oblect)可以从Oblect.getId()获取自增id 单独加上全局事务@GlobalTransactiona从Oblect.getId()获取的却是undo_log的自增id

  2. factoryBean.setTransactionFactory(new JdbcTransactionFactory()); 这样配置的话,本地事务@transactional无法回滚,必须配置DataSourceTransactionManager 配置seata的数据源代理才行

展开
收起
一人吃饱,全家不饿 2021-02-02 10:04:01 1842 0
来自:阿里开源
1 条回答
写回答
取消 提交回答
    1. 对于本地事物@transactional和全局事务冲突问题: 配置calss类需要加上以下配置:配置事务管理器数据源为seata数据代理
    /**
         * spring事务配置数据源代理
         * @param dataSourceProxy
         * @return
         */
        @Bean
        @Primary
        public DataSourceTransactionManager dataSourceTransactionManager(DataSourceProxy dataSourceProxy){
            DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
            transactionManager.setDataSource(dataSourceProxy);
            return transactionManager;
        }
    

    并且 factoryBean.setTransactionFactory(new SpringManagedTransactionFactory()); 必须配置成 SpringManagedTransactionFactory,因为mybatis默认用SpringManagedTransactionFactory

    /**
         * 替换 mybatis 的sqlSessionFactory,用数据源代理替换自动装配的数据源
         * @Param: dataSourceProxy  fescar数据源代理
         * @Return: SqlSessionFactory  mybatic使用的数据源
         */
        @Bean
        public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy) throws Exception {
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            factoryBean.setDataSource(dataSourceProxy);
            factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources("classpath*:/mapper/*.xml"));
    //        factoryBean.setTransactionFactory(new JdbcTransactionFactory());  //这个不可用
            factoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
            org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
            configuration.setMapUnderscoreToCamelCase(true);
            factoryBean.setConfiguration(configuration);
            return factoryBean.getObject();
        }
    
    1. 对于返回自增id是undo_log的自增id,解决方案如下: 可以在生成的xml文件的insert加上: useGeneratedKeys="true" keyProperty="id"
    //tkmybatis的话需要在生成的映射对象类的id上配置generator = "JDBC"如下:
    @Table(name = "xxx_credit_apply")
    @Setter
    @Getter
    public class XxxCreditApplyPo {
        @Id
        @GeneratedValue(generator = "JDBC")
        private Long id;
    }
    
    2021-02-02 10:04:13
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
+ 订阅
阿里巴巴相信开源的世界里人人贡献代码,人人获得收益,共同创造一个互帮互利的社区,促进技术进步和发展。
问答排行榜
最热
最新

相关电子书

更多
集成智能接入网关APP:优化企业级移动办公网络 立即下载
Java Spring Boot开发实战系列课程【第6讲】:Spring Boot 2.0实战MyBatis与优化(Java面试题) 立即下载
云效助力企业集成安全到DevOps中 立即下载