MyBatis春季交易

时间:2019-11-20 14:48:45

标签: java spring mybatis spring-transactions

我正在尝试正确使用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的引用,并使用此transactionManagerrollback或{{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>

1 个答案:

答案 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

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