【问题标题】:MyBatis Spring TransactionsMyBatis Spring 事务
【发布时间】: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 我们正在做rollbackcommit,这取决于我们是否遇到异常.

现在我的问题是,在我的 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>

请注意,我在 &lt;insert&gt;...&lt;/insert&gt; 中有多个插入,我希望它们全部发生或不发生。

This 是我使用的另一个参考。

所以一个普遍的问题是 MyBatis 会围绕我的&lt;insert&gt;...&lt;/insert&gt; 提供自动事务管理,还是我必须明确使用transactionManager 来实现事务管理功能? p>

【问题讨论】:

    标签: java spring mybatis spring-transactions


    【解决方案1】:

    这是您引用的文档中的引述:

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

    通过您提供的设置,交易时间跨度完全由 spring 管理,即如果 你使用declarative transaction management 你不需要额外做任何事情。 Spring 将在您的配置指向的位置开始事务。

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

    <tx:annotation-driven/>
    

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

    @Service
    public class MyService {
      @Autowired
      private UserDao userDao;
    
      @Transactional
      public addUser(User user) {
         userDao.insertUser(user);
      }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      相关资源
      最近更新 更多