Весенние транзакции MyBatis

Я пытаюсь правильно использовать функции управления транзакциями Spring, предоставляемые MyBatis

Я создаю sqlSessionFactor следующим образом:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:some/package/**/*.xml" />
    <property name="transactionFactory">
        <beanclass="org.mybatis.spring.transaction.SpringManagedTransactionFactory" />
    </property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <constructor-arg ref="dataSource" />
</bean>

Теперь есть этот раздел под названием «Управление программными транзакциями» здесь, который получает ссылку transactionManager и использует это transactionManager мы делаем rollback или commit в зависимости от того, получили мы исключение или нет.

Теперь мой вопрос заключается в том, что на моем уровне DAO я должен явно делать что-то вроде

public class UserDao extends SqlSessionDaoSupport {
    PlatformTransactionManager transactionManager; // wired using bean-property

    public void insertUser(Integer userId) {
        try {
            getSqlSession().insert("user-map.insertUser", userId);
        } catch (Exception e) {
            transactionManager.rollback(txStatus);
            throw e;
        }
        transactionManager.commit(txStatus);
    }
}

или просто использование следующей вещи (без программных транзакций) также будет выполнять все вставки транзакционным способом.

public class UserDao extends SqlSessionDaoSupport {

    public void insertUser(Integer userId) {
        getSqlSession().insert("user-map.insertUser", userId);
    }
}

мой файл сопоставления выглядит примерно так:

<insert id="insertUser" parameterType="HashMap">
    <!-- this contains multiple insert queries -->
</insert>

Обратите внимание, что у меня есть несколько вставок внутри <insert>...</insert>, и я хочу, чтобы либо все они произошли, либо ни одна из них.

Это еще одна ссылка, которую я использовал.

Итак, общий вопрос заключается в том, обеспечит ли MyBatis автоматическое управление транзакциями вокруг моего <insert>...</insert> или мне придется явно использовать transactionManager для реализации функции управления транзакциями?


person Lavish Kothari    schedule 20.11.2019    source источник


Ответы (1)


Вот цитата из документации, на которую вы ссылались:

MyBatis SqlSession предоставляет вам специальные методы для программной обработки транзакций. Но при использовании MyBatis-Spring ваши bean-компоненты будут внедрены с управляемым Spring SqlSession или управляемым Spring Mapper. Это означает, что Spring всегда будет обрабатывать ваши транзакции.

С предоставленной вами настройкой время транзакции полностью управляется Spring, то есть если вы используете декларативное управление транзакциями дополнительно ничего делать не нужно. Spring начнет транзакцию в точке, на которую она направлена ​​вашей конфигурацией.

Простой способ включить декларативное управление транзакциями — добавить это в конфигурацию Spring:

<tx:annotation-driven/>

А затем используйте @Transactional в своих методах обслуживания:

@Service
public class MyService {
  @Autowired
  private UserDao userDao;

  @Transactional
  public addUser(User user) {
     userDao.insertUser(user);
  }
}

Раздел в упомянутой вами документации посвящен (редким) случаям, когда вы хотите использовать программное управление транзакциями.

person Roman Konoval    schedule 21.11.2019