Heim  >  Artikel  >  Java  >  Relevante Einführung in das Spring-Transaktionsmanagement (mit Code)

Relevante Einführung in das Spring-Transaktionsmanagement (mit Code)

不言
不言nach vorne
2018-10-09 14:34:332675Durchsuche

Dieser Artikel bietet Ihnen eine relevante Einführung in das Spring-Transaktionsmanagement (mit Code). Freunde in Not können darauf verweisen.

Transaktion

Eine logische Reihe von Operationen, von denen jeder Teil entweder erfolgreich ist oder fehlschlägt

Eigenschaften der Transaktion

  • Konsistenz: Die Datenintegrität bleibt vor und nach der Transaktion konsistent

  • Atomizität: Transaktionen können nicht aufgeteilt werden, entweder sind alle erfolgreich oder alle scheitern

  • Isolation: Die Ausführung Anzahl der Transaktionen wird von anderen Transaktionen nicht beeinflusst und ist voneinander isoliert

  • Persistenz: Sobald die Transaktion abgeschlossen ist, wird sie in der Datenbank gespeichert und ist von den Systemauswirkungen nicht betroffen Absturz

Probleme, die entstehen, wenn die Merkmale nicht erfüllt sind

Probleme, die durch Isolation verursacht werden:

Lesen Sie das Problem

  • Dirty Read: Eine Transaktion liest Daten, die nicht von anderen Transaktionen festgeschrieben wurden.

  • Nicht wiederholbares Lesen: Eine Transaktion liest von anderen Transaktionen übermittelte Aktualisierungen Daten , was zu inkonsistenten Abfrageergebnissen führt

  • Phantomlesung: Eine Transaktion liest Einfügedaten aus einer anderen Transaktion , was zu inkonsistenten Abfrageergebnissen führt

Schreibproblem

  • Vorgang verloren

Leseproblem lösen

Transaktionsisolationsstufe festlegen

Relevante Einführung in das Spring-Transaktionsmanagement (mit Code)

   int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;
  • ISOLATION_DEFAULT: Stellt den Spring-Standardwert dar und gibt an, dass die Standardisolationsstufe der zugrunde liegenden Datenbank verwendet wird. Beispielsweise verwendet MySQL ISOLATION_REPEATABLE_READ und ISOLATION_READ_COMMITTED

  • ISOLATION_READ_UNCOMMITTED: Nicht festgeschriebener Lesevorgang, kann das Leseproblem nicht lösen

  • ISOLATION_READ_COMMITTED: Festgeschriebener Lesevorgang, kann gelöst werden das schmutzige Problem Lesen, kann Phantom-Lesevorgänge und nicht wiederholbare Lesevorgänge nicht lösen

  • ISOLATION_REPEATABLE_READ: Wiederholte Lesevorgänge, kann schmutzige Lesevorgänge und nicht wiederholbare Lesevorgänge lösen

  • ISOLATION_SERIALIZABLE: Kann alle Leseprobleme lösen, die Effizienz ist nicht hoch

Transaktionsmanagement-API von Spring

PlatformTransactionManager: Plattformtransaktionsmanager
PlatformTransactionManager ist eine Schnittstelle, die wird von der untersten Ebene von Spring Object zum Verwalten von Transaktionen verwendet.
Relevante Einführung in das Spring-Transaktionsmanagement (mit Code)

public interface PlatformTransactionManager {
    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;
}

offizielle Website-Adresse von spring thing
Die gängigsten Implementierungsklassen sind:

  1. DataSourceTransactionManager: unten Schicht verwendet JDBC-Transaktionsverwaltung

  2. HibernateTransactionManager: Die zugrunde liegende Schicht verwendet Hibernate-Transaktionsverwaltung

  • TransactionDefinition:
    Transaktion Definition: Transaktionen können definiert werden Zugehörige Informationen, Transaktionsausbreitungsverhalten, Isolationsstufe, Timeout-Informationen, ob schreibgeschützt

package org.springframework.transaction;

//可以看到事物的定义也是一个接口
public interface TransactionDefinition {
    //事物的传播行为,7种
    int PROPAGATION_REQUIRED = 0;
    int PROPAGATION_SUPPORTS = 1;
    int PROPAGATION_MANDATORY = 2;
    int PROPAGATION_REQUIRES_NEW = 3;
    int PROPAGATION_NOT_SUPPORTED = 4;
    int PROPAGATION_NEVER = 5;
    int PROPAGATION_NESTED = 6;
    
    //事物的隔离级别五种
    int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;

    //事物的超时时间,-1代表没有超时时间
    int TIMEOUT_DEFAULT = -1;

    int getPropagationBehavior();

    int getIsolationLevel();

    int getTimeout();

    boolean isReadOnly();

    String getName();
}
  • TransactionStatus: Transaktionsstatus
    Transaktion Status: Datensatzverwaltungstransaktionsprozess Objekte im Transaktionsstatus

Die sieben Transaktionsausbreitungsverhalten im Frühling

Das Transaktionsausbreitungsverhalten wird verwendet, um das Problem gegenseitiger Aufrufe zwischen Unternehmen zu lösen Methoden

Offizielles Website-Portal

Voraussetzung:
Methode A() in Methode B() aufrufen

Verschachtelte Transaktion

  • PROPAGATION_NESTED: Es gibt eine Transaktion in A und Transaktion A wird normal ausgeführt. Nachdem Transaktion A ausgeführt wurde, legen Sie einen Speicherpunkt fest und führen Sie Vorgang B aus. Wenn B eine Ausnahme auslöst, können Sie zur Sicherheit zur Ausgangsposition oder zum Speicherpunkt zurückkehren

dass sich die Operation in derselben Transaktion befindet

  • PROPAGATION_REQUIRED: Wenn Methode B Methode A aufruft und Methode A eine Transaktion hat, verwendet Methode B die Transaktion in A. Wenn in A keine Transaktion vorhanden ist, erstellt B eine Transaktion

  • PROPAGATION_SUPPORTS: B ruft A auf. Wenn in A eine Transaktion vorhanden ist, wird die Transaktion in A verwendet Keine Transaktion in A, B wird die Transaktion nicht verwenden

  • PROPAGATION_MANDATORY: Wenn A eine Transaktion hat, verwenden Sie die Transaktion in A, und es gibt keine Transaktion in A, werfen Sie eine Ausnahme

Stellen Sie sicher, dass sich die Vorgänge nicht im selben

  • PROPAGATION_REQUIRES_NEW in der Transaktion befinden: Es gibt eine Transaktion in A, unterbrechen Sie die A-Transaktion und die Die von B eröffnete Transaktion umfasst nur ihre eigenen Vorgänge. Es gibt keine Transaktion in A und die von B erstellte Transaktion enthält nur ihre eigene Operation

  • PROPAGATION_NOT_SUPPORTED: Es gibt eine Transaktion in A, A ist ausgesetzt und B verwendet die Transaktion nicht
    *PROPAGATION_NEVER: Es gibt eine Transaktion in A und B wird ausgelöst. Ausnahme

Spring bietet zwei Transaktionsverwaltungsmethoden

  • Deklarative Transaktionsverwaltung : Transaktionen deklarativ in der Spring-Konfigurationsdatei verarbeiten Als Ersatz für die codebasierte Transaktionsverarbeitung (häufiger verwendet)

  • Transaktionsverwaltung programmieren: Codebasierte Transaktionsverarbeitung erfordert das Schreiben von Code im Programm

    Deklaratives Transaktionsmanagement

    basiert auf XML

<!--配置事务管理器-->
    <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
        <property name="dataSource" ref="dataSource" ></property>
    </bean>
<!--配置事务-->
    <tx:advice id="myAdvice" transaction-manager="trancationManager">
        <tx:attributes>
            <!--配置事务传播和事务隔离-->
            <tx:method name="save*" propagation="REQUIRED" isolation="REPEATABLE_READ"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>
    <!--事务是利用aop实现的-->
    <aop:config>
        <aop:pointcut id="ponitcut" expression="execution(* com.amber.xml.service.AccountServiceImpl.transferMoney(..))"></aop:pointcut>
        <aop:advisor advice-ref="myAdvice" pointcut-ref="ponitcut" />
    </aop:config>

save* stellt eine Methode dar, die mit save beginnt, verwendet PROPATATION_REQUIRED-Transaktionsweitergabe und REPEATABLE_READ-Transaktionsisolation

基于注解

<!--配置事务管理器-->
    <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
        <property name="dataSource" ref="dataSource" ></property>
    </bean>
    <!--开启注解事务-->
    <tx:annotation-driven transaction-manager="trancationManager" />

使用tx:annotation-driven 开启事务的注解后,在使用的时候只需要在类或者方法上加入@Transactional就可以开启注解

基于xml的事务和基于注解的事务对比

  • 文件配置对比
    事务基于注解简化了xml中的

  • 使用比较
    使用注解必须在类或者方法上添加@Trasactional,如果有多个业务类,则需要在每个业务类上添加
    使用xml只需要在配置文件中配置包名即可

事务github代码

Das obige ist der detaillierte Inhalt vonRelevante Einführung in das Spring-Transaktionsmanagement (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen