我试图正确地使用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>现在有一个叫做“编程事务管理”的这里部分,它获取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);
}
}我的mapper文件如下所示:
<insert id="insertUser" parameterType="HashMap">
<!-- this contains multiple insert queries -->
</insert>请注意,我在<insert>...</insert>中有多个插入,我希望所有插入都发生或不发生。
这是我使用的另一个引用。
因此,一个普遍的问题是,<insert>...</insert>将围绕transactionManager 提供一个自动事务管理,还是必须显式地使用transactionManager来实现事务管理功能?。
发布于 2019-11-21 13:09:49
以下是您引用的文档的引文:
MyBatis
SqlSession为您提供了以编程方式处理事务的特定方法。但是当使用MyBatis时,您的bean将被注入SpringManagedSqlSession或Spring。这意味着Spring将始终处理您的事务。
使用您提供的设置,在spring之前完全管理事务timespan,也就是说,如果您使用声明式事务管理,您不需要额外地做任何事情。Spring将在您的配置所指向的点启动事务。
启用声明性事务管理的简单方法是将此添加到spring配置中:
<tx:annotation-driven/>然后在服务方法上使用@Transactional:
@Service
public class MyService {
@Autowired
private UserDao userDao;
@Transactional
public addUser(User user) {
userDao.insertUser(user);
}
}您提到的文档中的部分是关于当您想要使用编程事务管理时的(罕见的)情况。
https://stackoverflow.com/questions/58957099
复制相似问题