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
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 UpdateDirty Read
# 🎜 🎜#Zweite Art von verlorenem Update
nicht wiederholbarer Lesevorgang
Phantom-Lesevorgang
# 🎜🎜#Read Uncommitted
is
is
is |
is |
is Nein Nein 🎜🎜# | Nein | Nein | Ja |
Wiederholbares Lesen #🎜 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. |
|
Optimistische Sperre (benutzerdefiniert)
|
Versionsnummer, Zeitstempel usw. | #🎜 🎜# | Ü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 Transaktionseigenschaften einer Methode durch XML-Konfiguration. |
|
Deklarieren Sie die Transaktionsmerkmale einer Methode durch Annotationen.
|
Programmatische Transaktionen |
|
Transaktionen über TransactionTemplate verwalten und Datenbankoperationen darüber ausführen. |
|
5. Beispiel | 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
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!