Я использую 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]