Hier einige Punkte zur Transaktionsfunktion, die für den Datenbankzugriff unverzichtbar sind.
Dieser Artikel geht von Doma 2.44.0 aus.
Bitte lesen Sie auch Einführung in Doma, um eine Einführung in andere Funktionen von Doma zu erhalten.
Das erste, was bei Transaktionen zu beachten ist. Dies ist der Fall, wenn das von Ihnen verwendete Framework (z. B. Spring Framework) Transaktionsfunktionen bietet. Wenn Sie dies tun, sollten Sie es zuerst verwenden.
Das Spring Framework bietet Transaktionsfunktionen.
Legen Sie in der Methode "getDataSource" der Implementierungsklasse "org.seasar.doma.jdbc.Config" fest, dass die mit "org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy" umschlossene "DataSource" zurückgegeben wird. ** Dies ist sehr wichtig **.
Lesen Sie nach dem Ergreifen der oben genannten Maßnahmen dieses Handbuch und fügen Sie der Klasse oder Methode der Spring-Komponente "@ Transactional" hinzu, um die Transaktion auszuführen. verfügbar.
Wenn Sie doma-spring-boot verwenden, wird der obige "DataSource" -Wrapping automatisch durchgeführt. Es gibt spring-boot-jpetstore als Beispielanwendung, die die Transaktionsfunktion von Spring Framework unter Verwendung von doma-spring-boot verwendet.
Quarkus bietet Transaktionsfunktionen.
In der Methode "getDataSource" der Implementierungsklasse "org.seasar.doma.jdbc.Config" ist die von Agroal verwaltete "DataSource" die Verbindungspoolimplementierung von Quarkus. Bitte senden Sie `zurück.
Nachdem Sie die oben genannten Maßnahmen ergriffen haben, können Sie Transaktionen verwenden, indem Sie den Klassen und Methoden von CDI-Komponenten "@ Transactional" hinzufügen, wie in diesem Dokument beschrieben.
Wenn Sie Quarkus Extension for Doma verwenden, wird die obige Einstellung "DataSource" automatisch vorgenommen. Quarkus-sample ist eine Beispiel-App, die die Transaktionsfunktion von Quarkus mit Quarkus Extension for Doma verwendet.
Erwägen Sie die Verwendung der lokalen Transaktionen von Doma.
Die Merkmale der lokalen Transaktionen von Doma sind wie folgt.
org.seasar.doma.jdbc.tx.TransactionManager
(keine deklarative API wie @ Transactional
)Wie man es benutzt, wird im nächsten Abschnitt beschrieben.
Der Arbeitscode befindet sich in Erste Schritte, aber hier sind einige wichtige Auszüge.
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
//④ Übergeben Sie den Lambda-Ausdruck an die Transaktionsmanager-Methode
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();
//① Erstellen Sie eine transaktionsfähige Datenquelle
var dataSource =
new LocalTransactionDataSource("jdbc:h2:mem:tutorial;DB_CLOSE_DELAY=-1", "sa", null);
var jdbcLogger = new Slf4jJdbcLogger();
//② Erstellen Sie einen Transaktionsmanager
var transactionManager = new LocalTransactionManager(dataSource, jdbcLogger);
//(3) Ermöglichen Sie die Rückgabe der in (1) und (2) oben erstellten Instanz aus der Implementierungsklasse Config.
return new DbConfig(dialect, dataSource, jdbcLogger, transactionManager);
}
}
Instanziieren Sie "LocalTransactionDataSource". In diesem Beispiel wird die Verbindungs-URL usw. vom Konstruktor empfangen, es gibt jedoch auch einen Konstruktor, der die Instanz "DataSource" empfängt.
Übergeben Sie die oben in ① erstellte Instanz von LocalTransactionDataSource
an den Konstruktor, um LocalTransactionManager
zu instanziieren.
Übergeben Sie die in ① und ② erstellte Instanz an den Konstruktor von DbConfig
, der Implementierungsklasse von Config
, und instanziieren Sie sie.
Das tm
hier ist eine Instanz des LocalTransactionManager
, der in ② erstellt wurde.
Sie können eine Transaktion ausführen, indem Sie den Prozess, den Sie in der Transaktion behandeln möchten, als Lambda-Ausdruck an die "erforderliche" Methode von "tm" übergeben.
Die Methode "required" ist eine Methode, die gestartet wird, wenn die Transaktion noch nicht gestartet wurde, und es gibt andere Methoden wie die Methode "requireNew", mit der immer eine neue Transaktion gestartet wird, und die Methode "notSupported", mit der die Transaktion vorübergehend gestoppt wird. Diese Methoden können verschachtelt werden.
Die Transaktion wird zurückgesetzt, wenn Sie eine Ausnahme vom Lambda-Ausdruck auslösen oder die Methode "setRollbackOnly" aufrufen. Andernfalls wird es festgeschrieben.
Eine Einschränkung ist, dass beim Einrichten einer lokalen Transaktion der gesamte Datenbankzugriff von Doma grundsätzlich über den TransactionManager erfolgen sollte. Andernfalls erhalten Sie eine Ausnahme.
Ich habe die Punkte der Verwendung von Transaktionen in Doma vorgestellt.
Wenn Sie Doma verwenden und der Meinung sind, dass die Transaktion nicht gut funktioniert, lesen Sie bitte diesen Artikel und die verknüpften Artikel und Beispiele.
Recommended Posts