首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MyBatis Spring事务

MyBatis Spring事务
EN

Stack Overflow用户
提问于 2019-11-20 14:48:45
回答 1查看 741关注 0票数 1

我试图正确地使用MyBatis提供的spring事务管理功能

我创建sqlSessionFactor的方式如下:

代码语言:javascript
复制
<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>
代码语言:javascript
复制
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <constructor-arg ref="dataSource" />
</bean>

现在有一个叫做“编程事务管理”的这里部分,它获取transactionManager的引用,并且使用这个transactionManager,我们要做的是rollback还是commit,这取决于我们是否有异常。

现在我的问题是,在我的DAO层,我是否应该显式地做一些类似的事情

代码语言:javascript
复制
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);
    }
}

或者仅仅使用以下内容(没有编程事务)也将以事务性方式执行所有插入。

代码语言:javascript
复制
public class UserDao extends SqlSessionDaoSupport {

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

我的mapper文件如下所示:

代码语言:javascript
复制
<insert id="insertUser" parameterType="HashMap">
    <!-- this contains multiple insert queries -->
</insert>

请注意,我在<insert>...</insert>中有多个插入,我希望所有插入都发生或不发生。

是我使用的另一个引用。

因此,一个普遍的问题是,<insert>...</insert>将围绕transactionManager 提供一个自动事务管理,还是必须显式地使用transactionManager来实现事务管理功能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-21 13:09:49

以下是您引用的文档的引文:

MyBatis SqlSession为您提供了以编程方式处理事务的特定方法。但是当使用MyBatis时,您的bean将被注入SpringManagedSqlSession或Spring。这意味着Spring将始终处理您的事务。

使用您提供的设置,在spring之前完全管理事务timespan,也就是说,如果您使用声明式事务管理,您不需要额外地做任何事情。Spring将在您的配置所指向的点启动事务。

启用声明性事务管理的简单方法是将此添加到spring配置中:

代码语言:javascript
复制
<tx:annotation-driven/>

然后在服务方法上使用@Transactional

代码语言:javascript
复制
@Service
public class MyService {
  @Autowired
  private UserDao userDao;

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

您提到的文档中的部分是关于当您想要使用编程事务管理时的(罕见的)情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58957099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档