Весенняя транзакция mybatis для двух звонков - PullRequest
0 голосов
/ 19 мая 2018

Я использую mybatis с Spring.У меня есть 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 операция удаления по-прежнему не отменяется.

Примечание: удаление и вставка - это два разных метода на уровне картографа.Поэтому мы использовали транзакцию на уровне сервиса.

Stacktrace:

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]

1 Ответ

0 голосов
/ 19 мая 2018

Не уверен, почему вы хотите удалить запись, и переустановить обновление будет лучшим вариантом, если это возможно.Это относится больше к понятию транзакции, вот идея. Вы можете сделать следующее в своем классе маппера.

@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 - @Transactional - Что происходит в фоновом режиме?

...