retour @Transactional pas rouler printemps
-
25-10-2019 - |
Question
Dans le cadre d'une application web, je suis en train de construire un processus d'inscription. après la validation du processus, il y a trois statments sql à effectuer. Le cas échéant devrait échouer alors ils devraient tous être annulées. Toutefois, si j'écris volontairement le 3 sql à l'échec (utiliser un nom de table qui exist ne marche pas). Je vois exception étant jeté, mais les 1er et 2ème statments SWL ne sont pas annulées.
conseils de quelqu'un peut me sur la façon dont cela devrait être fait.
de mon 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 />
Ma classe de service d'enregistrement
public class Registration implements IRegistration {
@Autowired JdbcUserDao userDAO;
@Override
@Transactional (rollbackFor = Exception.class)
public boolean registerUser(Object command) {
return userDAO.registerUser(command);
}
}
ma méthode d'enregistrement 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;
}
exampl d'exception levée
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
Quelqu'un peut-il me dire ce que je l'ai manqué. Pourquoi quand le 3ème sql statment échoue faire les 2 autres opérations ne se révulsés?
La solution
Parce que vous attrapez l'exception dans votre OAC, il n'est pas jeté à TransactionManager.