Heim > Java > javaLernprogramm > Hauptteil

Beispielanalyse für die SpringBoot-Transaktionsverwaltung

WBOY
Freigeben: 2023-05-13 14:13:20
nach vorne
618 Leute haben es durchsucht

1. Definition einer Transaktion

Eine Transaktion ist eine logische Ausführungseinheit, die aus einer Folge von N-Schritten-Datenbankoperationen besteht, die entweder vollständig ausgeführt oder vollständig aufgegeben werden.

2. Transaktionsmerkmale Der unteilbare Mindestausführungskörper in der Anwendung

ACID

Konsistenz: Das Ergebnis der Transaktionsausführung muss dazu führen, dass sich die Daten von eins ändern Konsistenzzustand zu einem anderen Konsistenzzustand
  • Isolation: Die Ausführung jeder Transaktion stört sich nicht gegenseitig und die internen Vorgänge jeder Transaktion sind von anderen Transaktionen isoliert#🎜 🎜#
  • #🎜🎜 #Persistenz: Sobald eine Transaktion festgeschrieben ist, müssen alle Änderungen an den Daten im permanenten Speicher aufgezeichnet werden

  • 3 . Transaktionsisolation

    #🎜 🎜#Allgemeine Parallelitätsausnahmen

  • Die erste Art von verlorenem Update, die zweite Art von verlorenem Update

    #🎜🎜 #
Dirty Read, nicht wiederholbares Lesen, Phantom Read Eingereichte Daten

Read Committed: Gesendete Daten lesen
    #🎜🎜 #
  • Repeatable Read: Wiederholbares Lesen

  • Serializable: Serialisierbar

The erste Art von Aktualisierungsverlust: Rollback einer bestimmten Transaktion. Dadurch gehen Daten verloren, die durch eine andere Transaktion aktualisiert wurden.

    Die zweite Art von Aktualisierungsverlust: Die Übermittlung einer bestimmten Transaktion führt dazu, dass die durch eine andere Transaktion aktualisierten Daten verloren gehen.
  • Dirty Read: Eine Transaktion liest nicht festgeschriebene Daten aus einer anderen Transaktion.

  • Nicht wiederholbares Lesen: Bei einer bestimmten Transaktion sind die Ergebnisse des Lesens derselben Daten vorher und nachher inkonsistent.
  • Phantomlesung: Bei einer bestimmten Transaktion ist die Anzahl der vor und nach derselben Tabelle abgefragten Zeilen inkonsistent.

  • Isolation Level
  • First Class Lost Update

    Dirty Read
  • # 🎜 🎜#Zweite Art von verlorenem Update

nicht wiederholbarer Lesevorgang

Phantom-Lesevorgang

# 🎜🎜#Read Uncommitted

isisNeinNeinJaWiederholbares Lesen #🎜 Nein #Optimistische Sperre (benutzerdefiniert)#🎜 🎜# Überprüfen Sie vor dem Aktualisieren der Daten, ob sich die Versionsnummer geändert hat. Wenn eine Änderung auftritt, brechen Sie dieses Update ab, andernfalls aktualisieren Sie die Daten (Versionsnummer +1) 🎜#Deklarieren Sie die Transaktionsmerkmale einer Methode durch Annotationen.
package com.nowcoder.community.service;
import com.nowcoder.community.dao.AlphaDao;
import com.nowcoder.community.dao.DiscussPostMapper;
import com.nowcoder.community.dao.UserMapper;
import com.nowcoder.community.entity.DiscussPost;
import com.nowcoder.community.entity.User;
import com.nowcoder.community.util.CommunityUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.Date;
@Service
//@Scope("prototype")
public class AlphaService {
    @Autowired
    private AlphaDao alphaDao;
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private DiscussPostMapper discussPostMapper;
    @Autowired
    private TransactionTemplate transactionTemplate;
    public AlphaService() {
//        System.out.println("实例化AlphaService");
    }
    @PostConstruct
    public void init() {
//        System.out.println("初始化AlphaService");
    }
    @PreDestroy
    public void destroy() {
//        System.out.println("销毁AlphaService");
    }
    public String find() {
        return alphaDao.select();
    }
    // REQUIRED: 支持当前事务(外部事务),如果不存在则创建新事务.
    // REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).
    // NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(独立的提交和回滚),否则就会REQUIRED一样.
    @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
    public Object save1() {
        // 新增用户
        User user = new User();
        user.setUsername("alpha");
        user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
        user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
        user.setEmail("alpha@qq.com");
        user.setHeaderUrl("https://cache.yisu.com/upload/information/20220823/112/6198.png");
        user.setCreateTime(new Date());
        userMapper.insertUser(user);
        // 新增帖子
        DiscussPost post = new DiscussPost();
        post.setUserId(user.getId());
        post.setTitle("Hello");
        post.setContent("新人报道!");
        post.setCreateTime(new Date());
        discussPostMapper.insertDiscussPost(post);
        Integer.valueOf("abc");
        return "ok";
    }
    public Object save2() {
        transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
        transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        return transactionTemplate.execute(new TransactionCallback<Object>() {
            @Override
            public Object doInTransaction(TransactionStatus status) {
                // 新增用户
                User user = new User();
                user.setUsername("beta");
                user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
                user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
                user.setEmail("beta@qq.com");
                user.setHeaderUrl("https://cache.yisu.com/upload/information/20220823/112/6199.png");
                user.setCreateTime(new Date());
                userMapper.insertUser(user);
                // 新增帖子
                DiscussPost post = new DiscussPost();
                post.setUserId(user.getId());
                post.setTitle("你好");
                post.setContent("我是新人!");
                post.setCreateTime(new Date());
                discussPostMapper.insertDiscussPost(post);
                Integer.valueOf("abc");
                return "ok";
            }
        });
    }
}
Nach dem Login kopieren
is is is Nein Nein 🎜🎜#
4. Transaktionsmanagement Implementierungsmechanismus Pessimistische Sperre (Datenbank) #🎜🎜 ##🎜 🎜#Gemeinsame Sperre (S-Sperre): Nachdem Transaktion A bestimmten Daten eine gemeinsame Sperre hinzugefügt hat, können andere Transaktionen nur gemeinsame Sperren zu den Daten hinzufügen, aber keine exklusiven Sperren hinzufügen #🎜 🎜##🎜 🎜#Exklusive Sperre (X-Sperre): Nachdem Transaktion A bestimmten Daten eine exklusive Sperre hinzugefügt hat, können andere Transaktionen den Daten weder gemeinsame Sperren noch exklusive Sperren hinzufügen.
Versionsnummer, Zeitstempel usw. Deklarieren Sie die Transaktionseigenschaften einer Methode durch XML-Konfiguration.
Programmatische Transaktionen Transaktionen über TransactionTemplate verwalten und Datenbankoperationen darüber ausführen. 5. Beispiel

Das obige ist der detaillierte Inhalt vonBeispielanalyse für die SpringBoot-Transaktionsverwaltung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
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