English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In der Spring Boot Transaktionsverwaltung wird die Schnittstelle PlatformTransactionManager implementiert.
public interface PlatformTransactionManager { org.springframework.transaction.TransactionStatus getTransaction(org.springframework.transaction.TransactionDefinition transactionDefinition) throws org.springframework.transaction.TransactionException; void commit(org.springframework.transaction.TransactionStatus transactionStatus) throws org.springframework.transaction.TransactionException; void rollback(org.springframework.transaction.TransactionStatus transactionStatus) throws org.springframework.transaction.TransactionException; }
Wenn wir spring verwenden-Boot-Starter-Bei Abhängigkeit von jdbc wird der Framework automatisch DataSourceTransactionManager injizieren. Daher benötigen wir keine zusätzliche Konfiguration, um die Verwendung von @Transactional zur Transaktionsverwaltung zu ermöglichen.
jdbc-Transaktionsmanager
In Service, Methoden, die mit @Transactional annotiert sind, unterstützen Transaktionen. Wenn die Annotierung auf der Klasse liegt, unterstützen alle Methoden der Klasse standardmäßig Transaktionen.
Fälle mehrerer Transaktionsmanager
Eins: Sie können das Interface TransactionManagementConfigurer implementieren, das den Standard-Transaktionsmanager zurückgibt.
Zwei: Sie können den Wert auf dem spezifischen Ausführungsmodus einstellen
Wenn im Spring-Container mehrere Instanzen von PlatformTransactionManager existieren und keine Implementierung des Interfaces TransactionManagementConfigurer eine Standardwerte zurückgibt, müssen wir, wenn wir den Annotierung @Transactional in der Methode verwenden, value angeben. Wenn nicht angegeben, wird eine Ausnahme ausgelöst.
//@EnableTransactionManagement // Aktivierung der Annotierungs-Transaktionsverwaltung, entspricht der xml-Konfigurationsdatei <tx:annotation-getrieben /> @SpringBootApplication public class ProfiledemoApplication implements TransactionManagementConfigurer { @Resource(name="txManager2}) private PlatformTransactionManager txManager2; // 手动创建事务管理器1 datasource框架会自动注入 //在Spring容器中,我们手工注解@Bean 将被优先加载,框架不会重新实例化其他的 PlatformTransactionManager 实现类。 @Bean(name = "txManager1}) public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } // 创建事务管理器2 @Bean(name = "txManager2}) public PlatformTransactionManager txManager2(EntityManagerFactory factory) { return new JpaTransactionManager(factory); } // 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器 @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return txManager2; } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args); } }
具体实现
@Component public class DevSendMessage implements SendMessage { // 使用value具体指定使用哪个事务管理器 @Transactional(value="txManager1}) @Override public void send() { System.out.println(">>>>>>>>Dev Send()<<<<<<<<"); send2(); } @Transactional public void send2()) { System.out.println(">>>>>>>>Dev Send2() <<<<<<<<<<); } }
隔离级别
public enum Isolation { DEFAULT(TransactionDefinition.ISOLATION_DEFAULT), READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED), READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED), REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ), SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE); private final int value; Isolation(int value) { this.value = value; } public int value() { return this.value; } }
指定方法:通过使用 isolation 属性设置,例如:
@Transactional(isolation = Isolation.DEFAULT)
传播行为
事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。
Wir können sehen, dass die Enumerationklasse org.springframework.transaction.annotation.Propagation definiert ist,}6eine Wertrepräsentation für传播行为的枚举werte:
public enum Propagation { REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), NEVER(TransactionDefinition.PROPAGATION_NEVER), NESTED(TransactionDefinition.PROPAGATION_NESTED); private final int value; Propagation(int value) { this.value = value; } public int value() { return this.value; } }
REQUIRED : Wenn eine Transaktion vorhanden ist, wird diese Transaktion beigetreten; wenn keine Transaktion vorhanden ist, wird eine neue Transaktion erstellt. Standardwert.
SUPPORTS : Wenn eine Transaktion vorhanden ist, wird diese Transaktion beigetreten; wenn keine Transaktion vorhanden ist, wird fortgegangen, ohne transaktionsbasiert zu sein.
MANDATORY : Wenn eine Transaktion vorhanden ist, wird diese Transaktion beigetreten; wenn keine Transaktion vorhanden ist, wird eine Ausnahme ausgelöst. (Wird in Transaktionen erzwungen.)
REQUIRES_NEW : Eine neue Transaktion wird erstellt, und falls eine Transaktion vorhanden ist, wird diese Transaktion gehängt. (Oft für das Protokollieren von Logs verwendet, auch wenn das Protokoll vor dem R rolling zurückgerufen wird, wird diese Transaktion ausgeführt und Fehlerinformationen werden protokolliert.)
NOT_SUPPORTED : Aus nicht transaktionsbasierter Weise ausgeführt, wird die aktuelle Transaktion, falls vorhanden, gehängt.
NEVER : Aus nicht transaktionsbasierter Weise ausgeführt, wird eine Ausnahme ausgelöst, wenn eine Transaktion vorhanden ist.
NESTED : Wenn eine Transaktion vorhanden ist, wird eine Transaktion als eingebettete Transaktion der aktuellen Transaktion ausgeführt; wenn keine Transaktion vorhanden ist, ist dieser Wert äquivalent zu REQUIRED .
Bezeichnende Methode: Durch die Verwendung der propagation-Eigenschaft zu konfigurieren, z.B.:
@Transactional(propagation = Propagation.REQUIRED)
Fälle, in denen keine Transaktion zurückgerollt wird
Nur bei unbehandelten RuntimeException wird zurückgerollt
Fangen Sie die von catch ausgelöste Ausnahme ab, und beide Einführungen werden erfolgreich sein
@Override @Transactional public void insertandinsert(Staff staff) { staffDao.insert(staff); try { int i = 1 / 0; } e.printStackTrace(); } staffDao.insert(staff); }
Fügen Sie im catch-Statement der Methode im Service-Layer die Anweisung TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); hinzu, um manuell das Einfügen von Daten abzubrechen.
@Override @Transactional public void insertandinsert(Staff staff) throws Exception { try { staffDao.insert(staff); int i =1/0; staffDao.insert(staff); } TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }
Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die呐喊教程 unterstützen.
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet entnommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Falls Sie urheberrechtlich beanstandete Inhalte finden, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @, wenn Sie eine Beschwerde einreichen, und fügen Sie relevante Beweise bei. Bei nachgewiesener Urheberrechtsverletzung wird diese Website die beanstandeten Inhalte sofort löschen.)