[JAVA] Premiers pas avec Doma-Transactions

introduction

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

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.

Lors de l'utilisation de Spring Framework

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.

Lors de l'utilisation de Quarkus

Quarkus offre des capacités transactionnelles.

ʻLa méthode getDataSource de la classe d'implémentation de org.seasar.doma.jdbc.Configest laDataSource 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.

Si vous n'utilisez pas une structure qui fournit des fonctionnalités de transaction

Pensez à utiliser les transactions locales de Doma.

Les caractéristiques des transactions locales de Doma sont les suivantes.

Son utilisation est décrite dans la section suivante.

Transaction locale de Doma

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

① Créer une source de données activée pour les transactions

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.

② Créer un gestionnaire de transactions

Passez l'instance de LocalTransactionDataSource créée dans ① ci-dessus au constructeur pour instancier LocalTransactionManager.

(3) Rendre possible de renvoyer l'instance créée en (1) et (2) ci-dessus à partir de la classe d'implémentation de Config.

Passez l'instance créée dans ① et ② au constructeur de DbConfig, qui est la classe d'implémentation de Config, et instanciez-la.

④ Passez l'expression lambda à la méthode du gestionnaire de transactions

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.

en conclusion

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

Premiers pas avec Doma-Transactions
Premiers pas avec DBUnit
Premiers pas avec Ruby
Premiers pas avec Swift
Premiers pas avec le traitement Doma-Annotation
Premiers pas avec Java Collection
Premiers pas avec JSP et servlet
Premiers pas avec les bases de Java
Premiers pas avec Spring Boot
Premiers pas avec les modules Ruby
Premiers pas avec Java_Chapitre 5_Exercices pratiques 5_4
[Google Cloud] Premiers pas avec Docker
Premiers pas avec Docker avec VS Code
Premiers pas avec Ruby pour les ingénieurs Java
Premiers pas avec Docker pour Mac (installation)
Introduction au test de paramétrage dans JUnit
Introduction à Java à partir de 0 Partie 1
Premiers pas avec Ratpack (4) - Routage et contenu statique
Démarrez avec le fonctionnement de JVM GC
Premiers pas avec Language Server Protocol avec LSP4J
Premiers pas avec la création d'ensembles de ressources avec ListResoueceBundle
Premiers pas avec Java_Chapter 8_A propos des "Instances" et des "Classes"
Liens et mémos pour démarrer avec Java (pour moi-même)
Premiers pas avec Doma-Using Projection avec l'API Criteira
Premiers pas avec les sous-requêtes utilisant Doma avec l'API Criteria
Premiers pas avec Java 1 Assembler des éléments similaires
Premiers pas avec Kotlin à envoyer aux développeurs Java
Premiers pas avec Doma-Using Joins avec l'API Criteira
Premiers pas avec Doma - Introduction à l'API Criteria
Commencez avec Gradle
J'ai essayé de démarrer avec Gradle sur Heroku
Prise en main des programmes Java à l'aide de Visual Studio Code
Premiers pas avec les anciens ingénieurs Java (Stream + Lambda)
Démarrez avec Spring Boot
Prise en main de Completable Future (First Future)
Premiers pas avec Java et création d'un éditeur Ascii Doc avec JavaFX
Premiers pas avec Doma-Dynamic Construction de clauses WHERE avec l'API Criteria
Premiers pas avec Reactive Streams et l'API JDK 9 Flow
Premiers pas avec Git Hub Container Registry au lieu de Docker Hub
Commençons par la programmation parallèle
Revenir au début, démarrer avec Java ② Instructions de contrôle, instructions de boucle
Comment démarrer avec Slim
Résumer les principaux points de démarrage avec JPA appris avec Hibernate
Présentation de Swift / C Bridge avec l'histoire du portage d'Echo Server à l'aide de libuv
CompletableFuture Getting Started 2 (Essayez de faire CompletableFuture)
La coopération des messages a commencé avec Spring Boot
Premiers pas avec Micronaut 2.x ~ Construction native et déploiement sur AWS Lambda ~
Premiers pas avec le Machine Learning avec Spark "Price Estimate" # 1 Chargement des ensembles de données avec Apache Spark (Java)
J'ai essayé de démarrer avec Web Assembly
[Obsolète] Premiers pas avec GC et la gestion de la mémoire pour les machines virtuelles Java Je n'ai pas compris
Partie 2 Partie II. Comment procéder avec la mise en route Guide de référence de Spring Boot Remarque ①