【问题标题】:spring mybatis transaction for two db call两个db调用的spring mybatis事​​务
【发布时间】:2018-05-19 06:57:10
【问题描述】:

我在 Spring 中使用 mybatis。我有一个执行删除然后插入操作的 API。我希望这些操作在一个事务中,这样如果插入失败,删除操作就会回滚。

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@MapperScan(basePackages = "com.abc..mapper")
public class ABCCoreDataConfig {

    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        ....
        .....
        sessionFactory.setMapperLocations(
            new PathMatchingResourcePatternResolver()
                .getResources("classpath*:com/abc//mapper/**/*.xml"));

        return sessionFactory;
    }

    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

服务类:

@Service
@Transactional
public class MyService implements IMyService{

  @Autowired
    private MyMapper myMapper;

  @Transactional(propagation = Propagation.REQUIRED)
    public boolean addRecord() throws Exception {
            myMapper.deleteRecord(id);
            myMapper.insertRecord(- - -);
      return true;
    }
}

即使由于 MySQLIntegrityConstraintViolationException 导致插入失败,删除操作仍然没有恢复。

注意: delete 和 insert 是映射器级别的两种不同方法。因此,我们在服务层使用了事务。

堆栈跟踪:

23:11:29.452  DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
23:11:29.458  DEBUG org.mybatis.spring.SqlSessionUtils - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7d40dbdb]
23:11:36.685  DEBUG o.m.s.t.SpringManagedTransaction - JDBC Connection [jdbc:mysql://127.0.0.1:13306/abc?connectTimeout=1000, UserName=xyz@10.0.0.0, MySQL Connector Java] will be managed by Spring
23:11:36.690  DEBUG MyDao.delete - ==>  Preparing: DELETE FROM .....
23:11:36.711  DEBUG MyDao.delete - ==> Parameters: ....
23:11:36.807  DEBUG MyDao.delete - <==    Updates: 2
23:11:36.807  DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7d40dbdb]
23:11:36.807  DEBUG org.mybatis.spring.SqlSessionUtils - Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7d40dbdb] from current transaction
23:11:36.832  DEBUG MyDao.insert - ==>  Preparing: INSERT INTO .....
23:11:36.833  DEBUG MyDao.insert - ==> Parameters: ...
23:11:36.927  DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7d40dbdb]
23:11:36.997  DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7d40dbdb]
23:11:36.998  DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7d40dbdb]

【问题讨论】:

    标签: java spring spring-transactions spring-mybatis


    【解决方案1】:

    不确定为什么要删除记录并重新插入,如果可能,更新将是更好的选择。这更多与事务的概念有关,这是一个想法。您可以在映射器类中进行以下操作。

    @Transactional(propagation = Propagation.REQUIRED)
    public boolean deleteRecord() throws Exception {
    // delete code here      
    return true;
      }
    
    @Transactional(propagation = Propagation.REQUIRED)
    public boolean addRecord() throws Exception {
    // add code here      
    return true;
      }
    }
    

    这里 spring 注释会处理你的事务,有关更多信息,实际上事务使用这里解释的代理概念 Spring - @Transactional - What happens in background?

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2012-07-03
      • 2017-07-27
      • 1970-01-01
      • 2020-04-04
      • 2016-09-15
      相关资源
      最近更新 更多