我正在尝试正确使用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>
现在有一个称为“程序化交易管理”的部分here,它获取transactionManager
的引用,并使用此transactionManager
做rollback
或{{1} },具体取决于我们是否有例外。
现在我的问题是我应该在DAO层中显式地执行
commit
或仅使用以下内容(不进行程序性交易)也将以事务方式执行所有插入操作。
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>
内有多个插入,并且希望它们全部发生或不发生。
This是我正在使用的另一个参考。
因此,一个普遍的问题是MyBatis将在我的<insert>...</insert>
周围提供自动的交易管理,还是我必须显式地使用<insert>...</insert>
来实现交易管理功能? strong>
答案 0 :(得分:1)
这是您引用的文档中的引文:
MyBatis
@Expose public String a;
为您提供了以编程方式处理事务的特定方法。但是,当使用MyBatis-Spring时,将为您的bean注入Spring托管的SqlSession
或Spring托管的映射器。这意味着Spring将始终处理您的交易。
使用您提供的设置,交易时间跨度完全由spring管理,即 您使用declarative transaction management无需执行任何其他操作。 Spring将在您配置所指向的位置开始事务。
启用声明式事务管理的简单方法是将其添加到spring配置中:
SqlSession
然后在您的服务方法上使用<tx:annotation-driven/>
:
@Transactional
您提到的文档中的部分是关于您要使用程序化事务管理的(罕见)情况。