Ich versuche Transaktionen mit Spring-Boot, Feder-Daten und MySQL zu verstehen.Get Deadlock beim Ausführen 2 Transaktions-Methode mit Federdaten und Mysql
Ich erstellte Service UpdateService, der zum Aktualisieren von Datensatz in der Datenbank verwendet wird. Methoden ändern und ändern2 wird transaktional ausgeführt.
@Autowired
private UserRepo userRepo;
@Transactional(isolation = Isolation.SERIALIZABLE)
public void change() {
User user = userRepo.findOne("Jan");
write("before change", user);
sleep(2000);
user.setPassword("new password");
write("after change", user);
}
@Transactional(isolation = Isolation.SERIALIZABLE)
public void change2() {
User user = userRepo.findOne("Jan");
write("before change2", user);
user.setSecondName("new name");
write("after change2", user);
}
und wenn ich ändern und change2 Methoden aufrufen, erhalten i-Protokolle:
before change User(name=Jan, secondName=Adam, password=Kowalski)
before change2 User(name=Jan, secondName=Adam, password=Kowalski)
after change2 User(name=Jan, secondName=new name, password=Kowalski)
after change User(name=Jan, secondName=Adam, password=new password)
und danach auch bekam ich Ausnahme:
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
Meine Frage ist, warum Transaktion change2 beginnt vor der Änderung erledigt? Was ist der Grund für einen Stillstand?
Könnten Sie bitte mehr Kontext geben? dh. Wie werden 'change' und' change2' ausgeführt? Werden sie gleichzeitig ausgeführt? –
Sie werden vom Controller ausgeführt @RequestMapping ("/ ändern") private void change() { updateService.change(); } change2 sieht ähnlich aus Sie werden ausgeführt: Ich exec in Postman ändern und sofort change2 (das ist der Grund, dass ich Schlaf für 2s zu verhindern, um die erste Transaktion abzuschließen, bevor Sekunde starten will) – adrian215
In Ihrem Code nichts verhindert ' change2' um erst nach 'change' zu starten, beende seine Transaktion. Die Methode 'findOne' führt eine Auswahl im' SHARE MODE' durch, die gleichzeitiges Lesen erlaubt. Was ich nicht verstehe, ist der Stillstand. –