【发布时间】:2020-03-16 08:00:13
【问题描述】:
我正在尝试正确使用 MyBatis 提供的 Spring 事务管理功能
我正在以下列方式创建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>
现在有一个名为“Programmatic Transaction Management”here 的部分,它获得了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> 中有多个插入,我希望它们全部发生或不发生。
This 是我使用的另一个参考。
所以一个普遍的问题是 MyBatis 会围绕我的<insert>...</insert> 提供自动事务管理,还是我必须明确使用transactionManager 来实现事务管理功能? p>
【问题讨论】:
标签: java spring mybatis spring-transactions