Mybatis sqlSession.commit не работает, когда MYSQL установлен AUTOCOMMIT = 0 - PullRequest
0 голосов
/ 24 апреля 2018

Я использую springboot + mybatis + MYSQL (innodb)

Когда я устанавливаю MYSQL autocommit = 0 и выполняю транзакции в своем коде.Я обнаружил, что сделка не совершена.Ниже приведен мой код:

источник данных:

spring.datasource.url=jdbc:mysql://localhost:3306/zzzz?characterEncoding=utf8&useSSL=false
spring.datasource.username=xxxx
spring.datasource.password=yyyy
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Конфигурация Mybatis транзакции:

@Configuration
@EnableTransactionManagement
public class MyBatisConfiguration {

    @Autowired private DataSource dataSource;

    @Bean @Primary
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
}

И мой сервис для выполнения транзакции:

@Service
public class AlohaService {

    @Autowired private SqlSessionFactory sqlSessionFactory;

    public void customizedSqlSessionInsert() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserRoleMapper userRoleMapper = sqlSession.getMapper(UserRoleMapper.class);
        try {
            userRoleMapper.insert(new UserRole(0, "RRRRR", "ADMIN"));
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            sqlSession.close();
        }
    }
}

После выполнения метода customizedSqlSessionInsert я обнаружил, что запись select не содержит новой строки RRRR,ADMIN. Интересно то, что после запуска команды COMMIT в MySQL GUI Tool запись появляется в MySQL.

Почему sqlSession.commit(); не работает?Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 24 апреля 2018

Когда spring-mybatis используется для интеграции mybatis-spring (и это используется spring-boot), тогда методы commit / rollback в сеансе фактически не используются, так как транзакции управляются Spring.То есть весна знает, когда начинать и завершать транзакцию и как ее завершать (например, если выбрасывается исключение, транзакция откатывается и т. Д.).

Все операции, связанные с транзакциями, обрабатываются реализацией org.apache.ibatis.transaction.Transaction, которая в конфигурации по умолчанию mybatis-spring равна SpringManagedTransaction.

Вот из SpringManagedTransaction javadoc:

Если обработка транзакций Spring активна, она не будет блокировать все вызовы фиксации / отката / закрытия, если предположить, что менеджер транзакций Spring выполнит эту работу.

...