Я пытаюсь правильно использовать функции управления транзакциями 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
для реализации функции управления транзакциями?