Heim > Java > javaLernprogramm > Hauptteil

Ausführliche Erläuterung von Beispielen für die Verwendung von Anmerkungen durch Spring für die Transaktionsverwaltungskonfiguration

Y2J
Freigeben: 2017-05-02 11:47:47
Original
1581 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich die Verwendung von Anmerkungen für die Transaktionsverwaltungskonfiguration durch Spring vorgestellt. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor und werfen wir einen Blick darauf.

Zu verwendende Schritte:

Schritt 1. Führen Sie den -Namespace

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
 http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
Nach dem Login kopieren

Schritt 2. Beans mit @Transactional-Annotationen werden automatisch so konfiguriert, dass sie deklarative Transaktionen unterstützen

<!-- 事务管理器配置, Hibernate单数据源事务 -->
  <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
  
  <!-- 使用annotation定义事务 -->
  <tx:annotation-driven transaction-manager="defaultTransactionManager" proxy-target-class="true" />
Nach dem Login kopieren

Schritt 3. In der Schnittstelle oder Klasse Schreiben Sie bei der Deklaration ein @Transactional.

Wenn Sie es nur auf die Schnittstelle schreiben, wird die Implementierungsklasse der Schnittstelle geerbt. Die spezifischen Methoden der Implementierungsklasse der Schnittstelle können das überschreiben Einstellungen in der Klassendeklaration


@Transactional //Anmerkungen auf Klassenebene, anwendbar auf alle öffentlichen Methoden in der Klasse

Transaktionsausbreitungsverhalten und Isolationsstufe

Wenn Sie das Annotation-Transaktionsmanagement von Spring verwenden, sind Sie möglicherweise etwas verwirrt über das Transaktionsausbreitungsverhalten und die Isolationsstufe. Im Folgenden finden Sie eine detaillierte Einführung zur einfachen Referenz.

Thing-Annotation-Methode: @Transactional

Wenn vor einer Klasse markiert, führen alle Methoden in der markierten Klasse eine Transaktionsverarbeitung durch, Beispiel:

@Transactional
public class TestServiceBean implements TestService {}
Nach dem Login kopieren
Wenn einige Methoden in der Klasse keine Dinge erfordern:

@Transactional
public class TestServiceBean implements TestService {  
  private TestDao dao;  
  public void setDao(TestDao dao) {
    this.dao = dao;
  }  
  @Transactional(propagation = Propagation.NOT_SUPPORTED)
  public List<Object> getAll() {
    return null;
  }  
}
Nach dem Login kopieren

Einführung in das Ausbreitungsverhalten von Dingen:

@Transactional(propagation=Propagation .REQUIRED )


Wenn es eine Transaktion gibt, dann treten Sie der Transaktion bei, wenn nicht, erstellen Sie eine neue (standardmäßig)


@Transactional(propagation=Propagation. NOT_SUPPORTED)


Der Container öffnet keine Transaktionen für diese Methode


@Transactional(propagation=Propagation.REQUIRES_NEW)


Erstellen Sie eine neue Transaktion unabhängig davon, ob eine Transaktion vorliegt oder nicht. Die neue Ausführung wird abgeschlossen und die alte Transaktion wird weiterhin ausgeführt


@Transactional(propagation=Propagation.MANDATORY)


muss in einer bestehenden Transaktion ausgeführt werden, sonst wird eine Ausnahme ausgelöst


@Transactional(propagation=Propagation.NEVER)


muss ausgeführt werden in eine Transaktion, die nicht existiert, andernfalls wird eine Ausnahme ausgelöst (mit Propagation. MANDATORY (stattdessen)


@Transactional(propagation=Propagation.SUPPORTS)


Wenn andere Beans rufen diese Methode auf und deklarieren Transaktionen in anderen Beans. Wenn andere Beans keine Transaktionen deklarieren, sind keine Transaktionen erforderlich:

@Transactional(timeout=30) //Der Standardwert beträgt 30 Sekunden
Transaktionsisolationsstufe:

@Transactional(isolation = Isolation.READ_UNCOMMITTED)


Lesen Sie nicht festgeschriebene Daten (Dirty Reads, es treten nicht wiederholbare Lesevorgänge auf) ) Verwenden Sie grundsätzlich nicht


@Transactional(isolation = Isolation.READ_COMMITTED)


zum Lesen übermittelter Daten (nicht wiederholbare Lesevorgänge und Phantomlesevorgänge werden auftreten)


@Transactional(isolation = Isolation.REPEATABLE_READ)


Wiederholbarer Lesevorgang (Phantomlesevorgang). wird auftreten)


@Transactional(isolation = Isolation.SERIALIZABLE)


Serialisierung


MYSQL: Standard ist REPEATABLE_READ-Ebene

SQLSERVER: Standard ist READ_COMMITTED


Dirty Read: Eine Transaktion wird gelesen. Nicht festgeschriebene Aktualisierungsdaten von einer anderen Transaktion abrufen.

Nicht wiederholbares Lesen: In derselben Transaktion werden die Ergebnisse durch Lesen zurückgegeben Dieselben Daten sind mehrmals unterschiedlich, mit anderen Worten:


Nachfolgende Lesevorgänge können aktualisierte Daten lesen, die von einer anderen Transaktion übermittelt wurden. Im Gegenteil, „wiederholbare Lesevorgänge“ können dies garantieren, wenn Daten mehrfach gelesen werden Mal in derselben Transaktion


Die Daten sind dieselben, das heißt, nachfolgende Lesevorgänge können keine aktualisierten Daten lesen, die von einer anderen Transaktion übermittelt wurden


Phantomlesung: Eine Transaktion liest Einfügungsdaten übermittelt durch eine andere Transaktion


@ Beschreibung häufig verwendeter Parameter in Transaktionsanmerkungen

Parametername

Funktionsbeschreibung

参 数 名 称

功 能 描 述

readOnly

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)

rollbackFor

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:

指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

readOnly<🎜>< /td>
<🎜>Dieses Attribut wird verwendet. Legen Sie fest, ob es sich bei der aktuellen Transaktion um eine schreibgeschützte Transaktion handelt. Legen Sie den Wert auf true fest, um schreibgeschützt anzuzeigen. Der Standardwert ist false. Zum Beispiel: @Transactional(readOnly=true)<🎜>
<🎜>rollbackFor<🎜><🎜>Dieses Attribut wird zum Festlegen verwendet Das erforderliche Array von Ausnahmeklassen für das Rollback. Wenn in der Methode eine Ausnahme im angegebenen Ausnahmearray ausgelöst wird, wird die Transaktion zurückgesetzt. Zum Beispiel: <🎜><🎜>Geben Sie eine einzelne Ausnahmeklasse an: @Transactional(rollbackFor=RuntimeException.class)<🎜><🎜>Geben Sie mehrere Ausnahmeklassen an: @Transactional(rollbackFor={RuntimeException.class, Exception.class}) < 🎜>

Fortsetzung der Tabelle)

< tr > < td width="21%"><🎜>noRollbackForClassName<🎜>< / tr>

参 数 名 称

功 能 描 述

rollbackForClassName

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:

指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")

指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor

该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:

指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName

该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:

指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")

指定多个异常类名称:

@Transactional(noRollbackForClassName={"RuntimeException","Exception"})

propagation

该属性用于设置事务的传播行为,具体取值可参考表6-7。

例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation

该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置

timeout

该属性用于设置事务的超时秒数,默认值为-1表示永不超时

Parametername<🎜>
<🎜>Funktionsbeschreibung<🎜>
<🎜>rollbackForClassName <🎜><🎜>Dieses Attribut wird verwendet, um das Array der benötigten Ausnahmeklassennamen festzulegen Zurückgesetzt werden: Wenn in der Methode eine Ausnahme im angegebenen Ausnahmenamen-Array ausgelöst wird, wird die Transaktion zurückgesetzt. Beispiel: <🎜><🎜>Geben Sie einen einzelnen Ausnahmeklassennamen an: @Transactional(rollbackForClassName="RuntimeException")<🎜><🎜 >< span style="font-size: 14px">Geben Sie mehrere Ausnahmeklassennamen an: @Transactional(rollbackForClassName={"RuntimeException","Exception"})<🎜>
<🎜>noRollbackFor<🎜><🎜>Dieses Attribut wird verwendet, um ein Array von Ausnahmeklassen festzulegen, die kein Rollback erfordern. Wenn in der Methode eine Ausnahme im angegebenen Ausnahmearray ausgelöst wird, wird die Transaktion ausgeführt wird nicht zurückgesetzt. Beispiel: <🎜><🎜>Geben Sie eine einzelne Ausnahmeklasse an: @Transactional(noRollbackFor=RuntimeException.class)<🎜><🎜> Geben Sie mehrere Ausnahmeklassen an: @Transactional(noRollbackFor={RuntimeException.class, Exception.class})<🎜>
< 🎜>Dieses Attribut wird verwendet, um ein Array von Ausnahmeklassennamen festzulegen, die kein Rollback erfordern. Wenn in der Methode eine Ausnahme im angegebenen Ausnahmenamen-Array ausgelöst wird, wird die Transaktion ausgeführt wird nicht zurückgesetzt. Beispiel: <🎜><🎜>Geben Sie einen einzelnen Ausnahmeklassennamen an: @Transactional(noRollbackForClassName="RuntimeException")<🎜><🎜 >< span style="font-size: 14px">Geben Sie mehrere Ausnahmeklassennamen an:<🎜><🎜>@Transactional(noRollbackForClassName={"RuntimeException" , „Ausnahme“})<🎜>
<🎜>propagation< / span><🎜><🎜>Dieses Attribut wird verwendet, um das Transaktionsweitergabeverhalten festzulegen. Konkret Die Werte finden Sie in Tabelle 6-7. <🎜><🎜>Zum Beispiel: @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)<🎜>
<🎜>isolation<🎜><🎜>Dieses Attribut wird verwendet, um die Transaktionsisolationsstufe der zugrunde liegenden Datenbank festzulegen. Die Transaktionsisolationsstufe wird zur Handhabung der Parallelität mehrerer Transaktionen verwendet Normalerweise wird die Standardisolation der Datenbank verwendet, eine Einrichtung ist im Grunde nicht erforderlich<🎜>
<🎜> timeout<🎜><🎜>Dieses Attribut wird verwendet, um das Timeout der Transaktion festzulegen. Anzahl der Sekunden, der Standardwert ist -1, was bedeutet, dass es nie zu einem Timeout kommt<🎜>

注意的几点:

1 @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

2用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

如下:

 @Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
public void methodName() {
 throw new Exception("注释");

 }
 @Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚
public ItimDaoImpl getItemDaoImpl() {
 throw new RuntimeException("注释");
 }
Nach dem Login kopieren

3、@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

4、@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 元素的出现 开启 了事务行为。

5、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen für die Verwendung von Anmerkungen durch Spring für die Transaktionsverwaltungskonfiguration. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage