2012-02-15 20 views
2

ウェブアプリケーションの一部として、私は登録プロセスを構築しようとしています。プロセスを検証した後、3つのSQL文が実行されます。いずれかが失敗する場合は、すべてロールバックする必要があります。しかし、もし私が意図的に失敗する3番目のSQLを書く(存在しないテーブル名を使用する)。私は例外がスローされるのを見ますが、第1および第2のswl文はロールバックされません。Spring @transactional not rollingback

どうすればいいか教えてもらえますか?私のアプリケーションの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 /> 

マイ登録サービスクラス

public class Registration implements IRegistration { 
@Autowired JdbcUserDao userDAO; 

@Override 
@Transactional (rollbackFor = Exception.class) 
public boolean registerUser(Object command) { 
    return userDAO.registerUser(command); 
} 
} 

例外のExamplがスローされ

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; 
} 

私userDAO登録方法

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 

誰かが私が逃したものを教えてもらえますか?なぜ3番目のSQL文が失敗したら、他の2つのトランザクションはロールバックされないのですか?

+0

接続はどのように設定されていますか?自動コミットがオンになっていますか? –

+0

ERm、私の正直な答えは、私はジョンがわからないということです。私はこの小さなプロジェクトを春のサンプルプロジェクトに基づいて始めました。私はこれをチェックできるどこかにありますか? –

+0

目前:このコードを本番環境で使用しないでください。SQLインジェクションが可能になります! – Ralph

答えて

4

DAOで例外をキャッチしているため、例外はTransactionManagerにスローされません。

+0

DAOはエラーを登録サービスに送り返すべきですか? –

+0

それは正しいです。 – aweigold

+0

これで私のDAOは例外を返すようになりました。サービス層では、DAOへの呼び出しをtryキャッチでラップすれば、サービス層に捕まえられていることがわかります。 sql 3が例外を発生したにもかかわらず、SQL 1と2はロールバックされません。私はまだ何かを逃したことがありますか? –

関連する問題