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
<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">
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" />
Schritt 3. In der Schnittstelle oder Klasse Schreiben Sie bei der Deklaration ein @Transactional.
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 {}
@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; } }
Einführung in das Ausbreitungsverhalten von Dingen:
@Transactional(timeout=30) //Der Standardwert beträgt 30 Sekunden
Transaktionsisolationsstufe:
MYSQL: Standard ist REPEATABLE_READ-Ebene
Dirty Read: Eine Transaktion wird gelesen. Nicht festgeschriebene Aktualisierungsdaten von einer anderen Transaktion abrufen.
@ Beschreibung häufig verwendeter Parameter in Transaktionsanmerkungen
Parametername | Funktionsbeschreibung | ||||||
| <🎜>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)
| <🎜>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)<🎜> | < / tr>||||||||||||||
<🎜>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("注释"); }
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!