如何使用 myBatis 和 Spring 设置事务

发布于 2024-11-29 15:57:23 字数 1231 浏览 1 评论 0原文

我正在尝试设置交易但没有成功。 这是我的代码:

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
   .......
   <property name="defaultAutoCommit" value="false" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="configLocation" value="classpath:mybatis-configuration.xml" />
   <property name="dataSource" ref="dataSource" />
</bean>

@Transactional
private void prcessTransaction(...) {
 delete(...);
 //insert:
 for(Item item: itemList){
   insert(item)
 }
}

<delete id="delete" parameterType="map">
    delete from .....
  </delete>

<insert id="insert" parameterType="Item">
    insert into ....
  </insert>

看起来 processTransaction 方法不仅是一个事务,而且是多个事务的集合。

我正在使用 Spring 3.0.5、myBatis 3.0.4、mybatis-spring-1.0.1、Tomcat 7.0.19、Oracle 11.1.0.6.0

感谢您的帮助。

I am trying set up transaction but without success.
Here is my code:

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
   .......
   <property name="defaultAutoCommit" value="false" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="configLocation" value="classpath:mybatis-configuration.xml" />
   <property name="dataSource" ref="dataSource" />
</bean>

@Transactional
private void prcessTransaction(...) {
 delete(...);
 //insert:
 for(Item item: itemList){
   insert(item)
 }
}

<delete id="delete" parameterType="map">
    delete from .....
  </delete>

<insert id="insert" parameterType="Item">
    insert into ....
  </insert>

It looks like that prcessTransaction method is not only one transaction but sets of multiple transactions.

I am using Spring 3.0.5, myBatis 3.0.4, mybatis-spring-1.0.1, Tomcat 7.0.19, Oracle 11.1.0.6.0

Thanks for help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

柒七 2024-12-06 15:57:23

将 @transactional 放在私有方法上看起来有问题, Spring 文档 说:

在代理模式(默认)下,仅拦截通过代理传入的外部方法调用。这意味着自调用实际上是目标对象中的一个方法调用目标对象的另一个方法,即使被调用的方法被标记为@Transactional,也不会在运行时导致实际的事务。

同一部分有以下内容:

方法可见性和@Transactional

使用代理时,您应该仅将 @Transactional 注释应用于具有公共可见性的方法。如果您使用 @Transactional 注释来注释受保护的、私有的或包可见的方法,则不会引发错误,但带注释的方法不会显示配置的事务设置。如果您需要注释非公共方法,请考虑使用 AspectJ(见下文)。

Putting @transactional on a private method looks problematic, the Spring documentation says:

In proxy mode (which is the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual transaction at runtime even if the invoked method is marked with @Transactional.

The same section has this aside:

Method visibility and @Transactional

When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods.

千纸鹤带着心事 2024-12-06 15:57:23

我们遇到了类似的问题,但在更复杂的环境中,我们有 2 个数据库,每个数据库都有自己的事务管理器。我们让它工作的唯一方法是在 @Transactional("transactionManager") 注释上指定事务管理器实例。

它有效,但我不满意,因为我不明白为什么我们需要在注释上显式指定事务管理器。

We had a similar problem, but in a more complex environment where we have 2 databases with their own transaction manager each. The only way we got it to work was to specify the transaction manager instance on the @Transactional("transactionManager") annotation.

It works, though I'm left unsatisfied as I don't understand why we need to explicitly specify the transaction manager on the annotation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文