Heim  >  Artikel  >  Java  >  Beispielanalyse für die SpringBoot-Transaktionsverwaltung

Beispielanalyse für die SpringBoot-Transaktionsverwaltung

WBOY
WBOYnach vorne
2023-05-13 14:13:20578Durchsuche

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";
            }
        });
    }
}
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!

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