【问题标题】:Transaction not work when use spring4 @Transactional使用spring4 @Transactional时事务不起作用
【发布时间】:2016-05-12 15:41:53
【问题描述】:

使用 spring4 @Transactional 和 jdbctemplate 时事务不起作用!!请帮帮我

应用程序.xml

 <context:component-scan base-package="com.test" />

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

<bean class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:annotation-driven transaction-manager="txtManager"   proxy-target-class="true"/>

java代码

package com.test;

 @Component

public class TService {

@Autowired JdbcTemplate jdbcTemplate;

@Transactional(rollbackFor = Exception.class)
public void tt() throws Exception{

        jdbcTemplate.update("insert into t_test values(1)");
        jdbcTemplate.update("insert into t_test(dd) values(1)");

    }

}

控制器代码

    @Controller("")
public class Tcontroller {

    @Autowired TService ts; 

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public @ResponseBody Object all() throws Exception {
        ts.tt();
        return "";
    }

}

tt() 抛出异常,但 Transaction 没有回滚!

今天找到了这个

[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:833) - Unable to apply any optimisations to advised method: public void com.test.TService.tt() throws java.lang.Exception
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:797) - Found 'equals' method: public boolean java.lang.Object.equals(java.lang.Object)
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:833) - Unable to apply any optimisations to advised method: public java.lang.String java.lang.Object.toString()
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:802) - Found 'hashCode' method: public native int java.lang.Object.hashCode()
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:833) - Unable to apply any optimisations to advised method: protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:791) - Method is declared on Advised interface: public abstract int org.springframework.aop.framework.Advised.indexOf(org.springframework.aop.Advisor)
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:791) - Method is declared on Advised interface: public abstract int org.springframework.aop.framework.Advised.indexOf(org.aopalliance.aop.Advice)

代理创建失败?

【问题讨论】:

  • 你在哪里调用 tt() 方法。显示一个例子
  • 我猜你也有一个DispatcherServlet,它有一个不同的配置文件,其中还包含一个&lt;context:component-scan base-package="com.test" /&gt;...
  • 是的,你的回复提醒了我,applicationContext.xml 和 springmvc-servlet.xml 都包含 ... 问题已经解决, 再次感谢大家

标签: java spring transactions jdbctemplate spring-transactions


【解决方案1】:

当我在测试中抛出 null 时,我遇到了同样的问题。它似乎是 @Transaction 仅适用于 RuntimeException 的实例或子类。

哪个例外不是。

【讨论】:

    【解决方案2】:

    如果事务遇到未经检查的运行时异常,它总是会回滚。您的问题可能是由于您捕获了异常然后重新抛出它。完全没必要做这种事。

    Section 16.5.3:在其默认配置中,Spring 框架的事务 基础设施代码仅在情况下标记事务以进行回滚 运行时,未经检查的异常;也就是当抛出异常 是 RuntimeException 的实例或子类。 (错误也会 - 默认情况下 - 导致回滚)。抛出的检查异常 来自事务方法不会导致默认回滚 配置。

    阅读official doc

    【讨论】:

    • 只需阅读您编辑的问题。首先,您的 dao 方法会抛出 java.lang.Exception,但您的代码不会抛出任何已检查的异常,jdbcTemplate 也不会。为什么要申报?二、为什么要加rollbackFor=Exception.class?如果此方法中唯一可能的异常是 RuntimeException,则无需添加它。去掉两个不必要的陈述,然后再试一次。它会让你的代码看起来更干净,并希望给你想要的回滚。
    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 2021-06-06
    • 2021-10-03
    • 2016-04-07
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多