Kann jemand erklären, was Isolierung & Ausbreitung Parameter sind für in der @Transactional
Annotation anhand eines realen Beispiels?
Vor allem, wann und warum ich die Standardwerte ändern sollte.
Kann jemand erklären, was Isolierung & Ausbreitung Parameter sind für in der @Transactional
Annotation anhand eines realen Beispiels?
Vor allem, wann und warum ich die Standardwerte ändern sollte.
Sie wollen fast nie die Read Uncommited
denn es ist nicht wirklich ACID
willfährig. Read Commmited
ist eine gute Ausgangsposition. Repeatable Read
wird wahrscheinlich nur in Berichterstattungs-, Rollup- oder Aggregations-Szenarien benötigt. Beachten Sie, dass viele DBs, einschließlich Postgres, Repeatable Read nicht unterstützen, Sie müssen Serializable
stattdessen. Serializable
ist nützlich für Dinge, von denen Sie wissen, dass sie völlig unabhängig von allem anderen geschehen müssen; stellen Sie sich das so vor synchronized
in Java. Serializable geht Hand in Hand mit REQUIRES_NEW
Ausbreitung.
Ich benutze REQUIRES
für alle Funktionen, die UPDATE- oder DELETE-Abfragen ausführen, sowie für Funktionen auf "Service"-Ebene. Für Funktionen auf DAO-Ebene, die nur SELECTs ausführen, verwende ich SUPPORTS
der an einem TX teilnimmt, wenn ein solcher bereits gestartet ist (d.h. von einer Dienstfunktion aus aufgerufen wird).
Transaction Isolation und Transaction Propagation sind zwar verwandt, aber eindeutig zwei sehr unterschiedliche Konzepte. In beiden Fällen werden die Standardwerte an der Client-Grenzkomponente angepasst, entweder durch die Verwendung von Deklarative Transaktionsverwaltung ou Programmatische Transaktionsverwaltung . Einzelheiten zu den einzelnen Isolationsstufen und Ausbreitungsattributen finden Sie unter den nachstehenden Verweisen.
Wie und wann wirken sich bei zwei oder mehr laufenden Transaktionen/Verbindungen zu einer Datenbank die von Abfragen in einer Transaktion vorgenommenen Änderungen auf die Abfragen in einer anderen Transaktion aus bzw. sind für diese sichtbar? Es geht auch darum, welche Art von Datenbanksperre verwendet wird, um Änderungen in dieser Transaktion von anderen Transaktionen zu isolieren und umgekehrt. Dies wird normalerweise von der Datenbank/Ressource implementiert, die an der Transaktion beteiligt ist.
.
In einer Unternehmensanwendung gibt es für jede beliebige Anfrage/Verarbeitung viele Komponenten, die für die Erledigung der Aufgabe erforderlich sind. Einige dieser Komponenten markieren die Grenzen (Anfang/Ende) einer Transaktion, die in der jeweiligen Komponente und ihren Unterkomponenten verwendet wird. Für diese Transaktionsgrenzen von Komponenten gibt Transaction Propogation an, ob die jeweilige Komponente an der Transaktion teilnimmt oder nicht und was passiert, wenn die aufrufende Komponente bereits eine Transaktion erstellt/gestartet hat oder nicht. Dies entspricht den Java EE Transaktionsattributen. Dies wird in der Regel durch den Client-Transaktions-/Verbindungsmanager implementiert.
Referenz:
Ich habe gelaufen outerMethod
, method_1
et method_2
mit verschiedenen Ausbreitungsmodi.
Nachfolgend ist die Ausgabe für verschiedene Ausbreitungsmodi dargestellt.
@Transactional
@Override
public void outerMethod() {
customerProfileDAO.method_1();
iWorkflowDetailDao.method_2();
}
@Transactional(propagation=Propagation.MANDATORY)
public void method_1() {
Session session = null;
try {
session = getSession();
Temp entity = new Temp(0l, "XXX");
session.save(entity);
System.out.println("Method - 1 Id "+entity.getId());
} finally {
if (session != null && session.isOpen()) {
}
}
}
@Transactional()
@Override
public void method_2() {
Session session = null;
try {
session = getSession();
Temp entity = new Temp(0l, "CCC");
session.save(entity);
int i = 1/0;
System.out.println("Method - 2 Id "+entity.getId());
} finally {
if (session != null && session.isOpen()) {
}
}
}
Wir können dies ergänzen:
@Transactional(readOnly = true)
public class Banking_CustomerService implements CustomerService {
public Customer getDetail(String customername) {
// do something
}
// these settings have precedence for this method
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void updateCustomer(Customer customer) {
// do something
}
}
Sie können es so verwenden:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<ModificaOperativitaRapporto> eventMessage) {
//here some transaction related code
}
Sie können dieses Ding auch benutzen:
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
void flush();
boolean isCompleted();
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.