seata集成mybatis或者tkmybatis问题本地事物和全局事务冲突-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

来自:阿里开源 2021-02-02 10:04:01 1087 1
  1. 本地@transactional事务开启 mapper.insertSelective(Oblect)可以从Oblect.getId()获取自增id 单独加上全局事务@GlobalTransactiona从Oblect.getId()获取的却是undo_log的自增id

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

取消 提交回答
全部回答(1)
  • 一人吃饱,全家不饿
    2021-02-02 10:04:13
    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;
    }
    
    0 0
相关问答

1

回答

怎么使用Seata框架,来保证事务的隔离性呢?

2022-07-18 13:12:58 98浏览量 回答数 1

0

回答

Seata中出现同一事务两边 xid不一样的情况,这个是正常的吗?

2022-07-11 14:40:09 64浏览量 回答数 0

1

回答

Mybatis写CRUD用注解好还是xml好?

2022-03-31 13:41:20 141浏览量 回答数 1

1

回答

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

2021-10-25 16:34:03 503浏览量 回答数 1

1

回答

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

2021-10-20 15:52:24 442浏览量 回答数 1

2

回答

tk.mybatis没有selectByExample Java问题

2020-05-27 10:26:09 1147浏览量 回答数 2

1

回答

Spring Boot集成Druid遇到的一个小问题 Java问题

2020-05-27 10:25:32 542浏览量 回答数 1

1

回答

问个问题,一个有状态的flink程序消费kafka,如果切换kafka topic到一个#Flink

2020-04-29 13:34:48 1566浏览量 回答数 1

0

回答

云相册的API搜索接口SearchPhotos怎么使用

2017-10-27 11:18:11 1890浏览量 回答数 0

1

回答

spring3+mybatis 注入空指针问题,怎么做?

2016-03-04 15:01:26 3059浏览量 回答数 1
0
文章
1508
问答
来源圈子
更多
阿里巴巴相信开源的世界里人人贡献代码,人人获得收益,共同创造一个互帮互利的社区,促进技术进步和发展。
+ 订阅
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载