Transactions gérées par Spring sans l'annotation @Transactional
Je suis en utilisant le Printemps des annotations pour gérer mes transactions comme suit:
@Transactional(readOnly = true)
public class AlertServiceImpl implements AlertService {
private AlertDAO alertDAO;
public List<Alert> getAlerts(){
List<Alert> alerts = alertDAO.getAlerts();
return alerts;
}
}
Je me demande ce qui se passe si j'oublie l'annotation:
//Oops! Forgot to use transactional annotation
public class AlertServiceImpl implements AlertService {
private AlertDAO alertDAO;
public List<Alert> getAlerts(){
List<Alert> alerts = alertDAO.getAlerts();
return alerts;
}
}
Lorsque le alertDAO mise en œuvre est la suivante:
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
//no annotation here either
public class HibernateAlertDAO extends HibernateDaoSupport implements AlertDAO {
public List<Alert> getAlerts(){
//some implementation details that define queryString
Query query = getSession().createQuery(queryString);
List<Alert> alerts = query.list();
return alerts;
}
}
Il semble que Hibernate me permet d'extraire des données à partir de la base de données même sans l'annotation.
Quelles sont les conséquences de ce genre de négligence et quels sont les scénarios de la pire éventualité qui pourrait se produire?
source d'informationauteur Jukka Hämäläinen
Vous devez vous connecter pour publier un commentaire.
Selon la documentation (Printemps docs) c'est juste de métadonnées afin de donner une indication de ce que la méthode ou de l'interface peut être configurée par quelque chose qui est "un point de vue transactionnel au courant" (c'
<tx:annotation-driven/>
).Avec juste tx:annotation-driven et pas de
@Transactional
attribut je crois que vous obtenez le "par défaut" transactionality appliquée:En supposant que vous êtes à l'aide de la
<tx:annotation-driven />
de le piloter via un gestionnaire de transactions lors, à côté de la@Transactional
attribut signifie que vous ne pouvez pas appliquer les propriétés telles que la readOnlyisolementpropagationrollbackFornoRollbackFor etc.Je crois que MVC est légèrement différente de la session Hibernate est directement liée à la MVC demande - c'est à dire lorsque la demande est reçue le début de la transaction.
Revenir à votre exemple, le code pour getSession() dans HibernateDAOSupport est comme suit:
Qui à son tour appelle à:
qui, en définitive, les appels à :
Fondamentalement, une Transaction:Session est à égalité de 1:1 pour autant que je sache, et la seule façon d'exécuter sans une transaction est de dire à l'aide de JBoss qui a cuit dans la " persistance de la couche qui fournit le transactionality pour vous (sous la couette). Même si vous appelez
getQuery()
aprèsgetSession()
vous toujours efficacement les transactions effectuées que c'est un JDBC/Hibernate connexion.Sans annotation, vous perdez les avantages des transactions, comme les annulations.
Avec le @Transactional annotation que vous faites plus d'une opération de base de données, comme beaucoup d'insertions et de l'un tombe en panne, toutes les opérations de la transaction peut restauration de donner de la consistance à vos données.
C'est aussi pourquoi il est recommandé de mettre l'annotation dans les services qui ne sont pas dans le DAOs.
Dans votre scénario, votre DAO exécute sans transaction, probablement avec l'auto-commit.
Si vous voulez éviter ce genre d'erreur à l'avenir et besoin de toutes vos services pour s'exécuter dans la transaction, vous pouvez protéger DAO couche avec
@Transactional
annotation:Cette annotation besoin de service de la couche de déclarer des transactions et jeter l'exception du contraire.
Rien ne se passe si vous n'avez pas mis le @transactional Annotation Fondamentalement @Transactionnelle n'est pas obligatoire de mettre sur le haut de la signature de la méthode, il est juste à l'utiliser pour informer le compilateur lors de votre transactionnelle est en lecture seule=true (uniquement pour la récupération des données l'objectif) et quand il est en lecture seule=false(uniquement pour l'insert update delete opérations)