Java Spring@transactional不回滚

Java Spring@transactional不回滚,java,spring,transactional,Java,Spring,Transactional,作为web应用程序的一部分,我正在尝试构建一个注册过程。验证流程后,将执行三个sql语句。如果任何一个失败了,那么它们都应该被回滚。但是,如果我有意编写第三个sql,则会失败(使用不存在的表名)。我看到异常被抛出,但第一个和第二个swl状态没有回滚 有人能告诉我怎么做吗 从我的application-context.xml <bean id="transactionManager" class="org.springframework.jdbc.datasource.

作为web应用程序的一部分,我正在尝试构建一个注册过程。验证流程后,将执行三个sql语句。如果任何一个失败了,那么它们都应该被回滚。但是,如果我有意编写第三个sql,则会失败(使用不存在的表名)。我看到异常被抛出,但第一个和第二个swl状态没有回滚

有人能告诉我怎么做吗

从我的application-context.xml

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

    <bean id="userDAO" class="com.doyleisgod.golf.database.JdbcUserDao">
      <property name="dataSource" ref="dataSource"></property>
    </bean>

    <bean id="registration" class="com.doyleisgod.golf.services.Registration"/>

    <tx:annotation-driven /> 
我的userDAO注册方法

    public boolean registerUser(Object command)  {
    try {
        setUserCommand(command);
        sql = "INSERT INTO users (USERNAME,PASSWORD, ENABLED)VALUES ('"+username+"', '"+EncryptedPassword+"', TRUE);";
        getSimpleJdbcTemplate().update(sql);

        sql = "INSERT INTO user_roles (USERNAME,AUTHORITY)VALUES ('"+username+"', 'ROLE_USER');";
        getSimpleJdbcTemplate().update(sql);

        sql = "INSERT INTO users_details (USERNAME,FIRST_NAME, LAST_NAME, EMAIL_ADDRESS, HANDICAP)VALUES ('"+username+"', '"+firstname+"', '"+lastname+"', '"+email+"', '"+handicap+"');";
        getSimpleJdbcTemplate().update(sql);

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
        return true;
}
正在引发的异常的示例

    15-Feb-2012 21:13:48 org.springframework.jdbc.support.SQLErrorCodesFactory <init>
INFO: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [INSERT INTO users_details (USERNAME,FIRST_NAME, LAST_NAME, EMAIL_ADDRESS, HANDICAP)VALUES ('d', 'd', 'd', 'd', '0');]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'golf.users_details' doesn't exist
15-Feb-2012 21:13:48 org.springframework.jdbc.support.SQLErrorCodesFactory
信息:加载的SQLErrorCodes:[DB2、Derby、H2、HSQL、Informix、MS-SQL、MySQL、Oracle、PostgreSQL、Sybase]
org.springframework.jdbc.badsqlgramarexception:StatementCallback;错误的SQL语法[在用户详细信息(用户名、名、姓、电子邮件地址、障碍)中插入值('d','d','d','d','0');];嵌套异常为com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表“golf.users\u details”不存在


有人能告诉我我错过了什么吗。为什么当第三个sql语句失败时,其他两个事务没有回滚?

因为您在DAO中捕获异常,它不会被抛出到TransactionManager。

因为您在DAO中捕获异常,它不会被抛出到TransactionManager。

连接是如何建立的?它是否开启了自动提交功能?呃,我诚实的回答是我不确定john。我根据一个spring示例项目启动了这个小项目。有什么地方可以检查吗?顺便说一句:不要在生产中使用此代码,它会启用SQL注入!!哦……刚才我正在用tomcat和mysql在本地主机上构建和运行,但我曾经计划过,一旦我有了一个工作示例,就可以在某个地方托管它。我不知道这会是个问题连接是如何建立的?它是否开启了自动提交功能?呃,我诚实的回答是我不确定john。我根据一个spring示例项目启动了这个小项目。有什么地方可以检查吗?顺便说一句:不要在生产中使用此代码,它会启用SQL注入!!哦……刚才我正在用tomcat和mysql在本地主机上构建和运行,但我曾经计划过,一旦我有了一个工作示例,就可以在某个地方托管它。我不知道这会是一个问题,所以DAO应该将错误返回给注册服务?好的,现在我的DAO正在返回异常。在服务层,如果我在try-catch中rap对DAO的调用,我可以看到excation在服务层被捕获。但sql 1和sql 2仍然不会回滚,即使sql 3导致了异常。我还漏掉什么吗?没有。。。你也不能在那里捕捉到异常。。。让TransactionManager抓住它。如果您需要处理它,请将它抛出到事务注释方法之外。那么事务管理器在这幅图中的位置是什么呢。我喜欢这样的registrationcontroller>resregistration服务(当@transactional应用于该方法时)>userDAO expetion发生在被调用的方法uersDAO中的sql3中。userDAO方法正在将异常发回RegistrationService。要么我必须尝试在这里捕获它,要么向注册控制器抛出错误,要么我没有有效的代码。那么我应该如何实现以使事务管理器捕获异常呢?TransactionManager围绕@Transactional注释方法运行。如果您捕获并吞咽,它将永远不会看到它回滚。因此DAO应该将错误返回到注册服务?好的,那么现在我的DAO正在返回异常。在服务层,如果我在try-catch中rap对DAO的调用,我可以看到excation在服务层被捕获。但sql 1和sql 2仍然不会回滚,即使sql 3导致了异常。我还漏掉什么吗?没有。。。你也不能在那里捕捉到异常。。。让TransactionManager抓住它。如果您需要处理它,请将它抛出到事务注释方法之外。那么事务管理器在这幅图中的位置是什么呢。我喜欢这样的registrationcontroller>resregistration服务(当@transactional应用于该方法时)>userDAO expetion发生在被调用的方法uersDAO中的sql3中。userDAO方法正在将异常发回RegistrationService。要么我必须尝试在这里捕获它,要么向注册控制器抛出错误,要么我没有有效的代码。那么我应该如何实现以使事务管理器捕获异常呢?TransactionManager围绕@Transactional注释方法运行。如果你抓住并吞下,它将永远看不到它会后退。
    15-Feb-2012 21:13:48 org.springframework.jdbc.support.SQLErrorCodesFactory <init>
INFO: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [INSERT INTO users_details (USERNAME,FIRST_NAME, LAST_NAME, EMAIL_ADDRESS, HANDICAP)VALUES ('d', 'd', 'd', 'd', '0');]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'golf.users_details' doesn't exist