Voici quelques points sur la fonction de transaction indispensable pour accéder à la base de données.
Cet article suppose Doma 2.44.0.
Veuillez également lire Introduction à Doma pour une introduction aux autres fonctionnalités de Doma.
La première chose à considérer concernant les transactions. Il s'agit de savoir si le framework que vous utilisez (tel que Spring Framework) fournit une fonctionnalité de transaction. Si c'est le cas, pensez à l'utiliser en premier.
Le Spring Framework fournit des fonctionnalités transactionnelles.
La méthode getDataSource
de la classe d'implémentation de ʻorg.seasar.doma.jdbc.Config doit être définie pour renvoyer la
DataSource encapsulée à l'aide de ʻorg.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
. ** C'est très important **.
Après avoir pris les mesures ci-dessus, reportez-vous à ce guide et ajoutez @ Transactional
à la classe ou à la méthode du composant Spring pour exécuter la transaction. disponible.
Si vous utilisez doma-spring-boot, le wrapping DataSource
ci-dessus sera effectué automatiquement. Spring-boot-jpetstore est un exemple d'application qui utilise la fonction de transaction de Spring Framework à l'aide de doma-spring-boot.
Quarkus offre des capacités transactionnelles.
ʻLa méthode getDataSource
de la classe d'implémentation de org.seasar.doma.jdbc.Configest la
DataSource gérée par Agroal qui est l'implémentation du pool de connexions de Quarkus. Veuillez retourner `.
Après avoir pris les mesures ci-dessus, vous pouvez utiliser des transactions en ajoutant «@ Transactional» aux classes et méthodes des composants CDI comme décrit dans ce document.
Si vous utilisez Quarkus Extension for Doma, le paramètre DataSource
ci-dessus sera effectué automatiquement. Quarkus-sample est un exemple d'application qui utilise la fonction de transaction de Quarkus à l'aide de Quarkus Extension for Doma.
Pensez à utiliser les transactions locales de Doma.
Les caractéristiques des transactions locales de Doma sont les suivantes.
ThreadLocal
pour gérer les connexions sur une base par thread(pas une API déclarative comme
@ Transactional`)Son utilisation est décrite dans la section suivante.
Le code de travail peut être trouvé dans Getting-started, mais voici quelques extraits importants.
Main.java
public class Main {
public static void main(String[] args) {
var config = createConfig();
var tm = config.getTransactionManager();
// setup database
var appDao = new AppDaoImpl(config);
tm.required(appDao::create);
// read and update
//④ Passez l'expression lambda à la méthode du gestionnaire de transactions
tm.required(
() -> {
var repository = new EmployeeRepository(config);
var employee = repository.selectById(1);
employee.age += 1;
repository.update(employee);
});
}
private static Config createConfig() {
var dialect = new H2Dialect();
//① Créer une source de données activée pour les transactions
var dataSource =
new LocalTransactionDataSource("jdbc:h2:mem:tutorial;DB_CLOSE_DELAY=-1", "sa", null);
var jdbcLogger = new Slf4jJdbcLogger();
//② Créer un gestionnaire de transactions
var transactionManager = new LocalTransactionManager(dataSource, jdbcLogger);
//(3) Rendre possible de renvoyer l'instance créée en (1) et (2) ci-dessus à partir de la classe d'implémentation de Config.
return new DbConfig(dialect, dataSource, jdbcLogger, transactionManager);
}
}
Instanciez LocalTransactionDataSource
.
Dans cet exemple, l'URL de connexion, etc. est reçue par le constructeur, mais il a également un constructeur qui reçoit l'instance DataSource
.
Passez l'instance de LocalTransactionDataSource
créée dans ① ci-dessus au constructeur pour instancier LocalTransactionManager
.
Passez l'instance créée dans ① et ② au constructeur de DbConfig
, qui est la classe d'implémentation de Config
, et instanciez-la.
Le tm
ici est une instance du LocalTransactionManager
créé dans ②.
Vous pouvez exécuter une transaction en passant le processus que vous souhaitez gérer dans la transaction à la méthode required
of tm
en tant qu'expression lambda.
La méthode required
est une méthode qui démarre si la transaction n'a pas encore été lancée, et il existe d'autres méthodes telles que la méthode requiresNew
qui démarre toujours une nouvelle transaction et la méthode notSupported
qui arrête temporairement la transaction. Ces méthodes peuvent être imbriquées.
La transaction est annulée si vous lancez une exception à partir de l'expression lambda ou appelez la méthode setRollbackOnly
. Sinon, il sera commis.
Une mise en garde est que si vous configurez une transaction locale, tous les accès à la base de données par Doma doivent, en principe, se faire via TransactionManager
. Sinon, vous obtiendrez une exception.
J'ai présenté les points d'utilisation des transactions dans Doma.
Si vous utilisez Doma et pensez que la transaction ne fonctionne pas correctement, veuillez vous référer à cet article et aux articles et exemples liés.
Recommended Posts