Wichtige Konzepte
Auto-Commit-Modus
Bei MySQL-Datenbanken befindet sich die Datenbank standardmäßig im Auto-Commit-Modus. Jede Anweisung befindet sich in einer separaten Transaktion. Wenn die Anweisung ausgeführt wird, wird die Transaktion implizit festgeschrieben, wenn die Ausführung erfolgreich ist, und die Transaktion wird implizit zurückgesetzt, wenn die Ausführung fehlschlägt. Für die normale Transaktionsverwaltung befindet sich eine Gruppe zusammengehöriger Vorgänge in einer Transaktion, daher muss der automatische Übermittlungsmodus der Datenbank deaktiviert werden. So können Sie ihn anzeigen:
Überprüfen Sie, ob der Befehl automatisch übermittelt wird (EIN). bedeutet, dass die automatische Übermittlung aktiviert ist. Der Wert ist 1. AUS bedeutet, dass die automatische Übermittlung deaktiviert ist. Der Wert ist 0):
show variables like 'autocommit';
Nach dem Deaktivieren der automatischen Übermittlung befindet sich der Benutzer immer in einer Transaktion und zwar in der aktuellen Die Transaktion wird erst beendet, wenn eine Commit- oder Rollback-Anweisung ausgeführt wird. Starten Sie erneut eine neue Transaktion.
DataSource connection = masterDataSource.getConnection(); connection.setAutoCommit(false);
Transaktionsisolationsstufe
Die Isolationsstufe bezieht sich auf den Grad der Isolation zwischen mehreren gleichzeitigen Transaktionen. Die TransactionDefinition-Schnittstelle definiert fünf Konstanten, die Isolationsstufen angeben:
1, TransactionDefinition.ISOLATION_DEFAULT
: Dies ist der Standardwert, der angibt, dass die Standardisolationsstufe der zugrunde liegenden Datenbank verwendet wird. Bei den meisten Datenbanken ist dieser Wert normalerweise TransactionDefinition.ISOLATION_READ_COMMITTED
.
2, TransactionDefinition.ISOLATION_READ_UNCOMMITTED
: Diese Isolationsstufe bedeutet, dass eine Transaktion Daten lesen kann, die von einer anderen Transaktion geändert, aber noch nicht festgeschrieben wurden. Diese Stufe verhindert keine Dirty Reads, nicht wiederholbaren Lesevorgänge und Phantom Reads, daher wird diese Isolationsstufe selten verwendet. PostgreSQL verfügt beispielsweise tatsächlich nicht über diese Ebene.
3. TransactionDefinition.ISOLATION_READ_COMMITTED
: Diese Isolationsstufe bedeutet, dass eine Transaktion nur Daten lesen kann, die von einer anderen Transaktion übermittelt wurden. Diese Stufe verhindert fehlerhafte Lesevorgänge und ist in den meisten Situationen der empfohlene Wert.
4. TransactionDefinition.ISOLATION_REPEATABLE_READ
: Diese Isolationsstufe bedeutet, dass eine Transaktion eine Abfrage während des gesamten Prozesses mehrmals ausführen kann und die zurückgegebenen Datensätze jedes Mal gleich sind. Diese Ebene verhindert fehlerhafte Lesevorgänge und nicht wiederholbare Lesevorgänge.
5, TransactionDefinition.ISOLATION_SERIALIZABLE
: Alle Transaktionen werden nacheinander ausgeführt, sodass keine Möglichkeit einer Interferenz zwischen Transaktionen besteht. Mit anderen Worten, diese Ebene kann schmutzige Lesevorgänge, nicht wiederholbare Lesevorgänge und Phantome verhindern liest. Dies wird jedoch die Leistung des Programms erheblich beeinträchtigen. Normalerweise wird diese Ebene nicht verwendet.
Transaktionsausbreitungsverhalten
Das sogenannte Transaktionsausbreitungsverhalten bedeutet, dass es mehrere Möglichkeiten gibt, einen Transaktionskontext anzugeben, wenn vor dem Start der aktuellen Transaktion bereits ein Transaktionskontext vorhanden ist Ausführungsverhalten transaktionaler Methoden. Die TransactionDefinition-Definition enthält die folgenden Konstanten, die das Ausbreitungsverhalten darstellen:
1, TransactionDefinition.PROPAGATION_REQUIRED
: Wenn derzeit eine Transaktion vorhanden ist, schließen Sie sich der Transaktion an. Wenn derzeit keine Transaktion vorhanden ist, erstellen Sie eine neue Transaktion. Dies ist der Standardwert.
2. TransactionDefinition.PROPAGATION_REQUIRES_NEW
: Erstellen Sie eine neue Transaktion. Wenn derzeit eine Transaktion vorhanden ist, unterbrechen Sie die aktuelle Transaktion.
3. TransactionDefinition.PROPAGATION_SUPPORTS
: Wenn derzeit eine Transaktion vorhanden ist, schließen Sie sich der Transaktion an. Wenn derzeit keine Transaktion vorhanden ist, führen Sie die Ausführung nicht transaktional aus.
4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED
: Im nicht-transaktionalen Modus ausführen. Wenn derzeit eine Transaktion vorhanden ist, wird die aktuelle Transaktion ausgesetzt.
5, TransactionDefinition.PROPAGATION_NEVER
: Im nicht-transaktionalen Modus ausführen. Wenn derzeit eine Transaktion vorhanden ist, wird eine Ausnahme ausgelöst.
6, TransactionDefinition.PROPAGATION_MANDATORY
: Wenn derzeit eine Transaktion vorhanden ist, treten Sie der Transaktion bei. Wenn derzeit keine Transaktion vorhanden ist, lösen Sie eine Ausnahme aus.
7, TransactionDefinition.PROPAGATION_NESTED
: Wenn derzeit eine Transaktion vorhanden ist, erstellen Sie eine Transaktion, die als verschachtelte Transaktion der aktuellen Transaktion ausgeführt werden soll. Wenn derzeit keine Transaktion vorhanden ist, entspricht dieser Wert TransactionDefinition.PROPAGATION_REQUIRED
.
Schutzpunkt (Savepoints
)
Zunächst müssen Sie wissen, dass es für die Anzahl der Sicherungspunkte keine Begrenzung gibt Ähnlich wie Snapshots in virtuellen Maschinen. Ein Sicherungspunkt ist ein Punkt in einer Transaktion. Wird verwendet, um einen Teil der Transaktion abzubrechen. Wenn die Transaktion endet, werden alle in der Transaktion definierten Speicherpunkte automatisch gelöscht.
Beim Ausführen eines Rollbacks können Sie durch Angabe eines Speicherpunkts zum angegebenen Punkt zurückkehren.
Mehrere wichtige Vorgänge zum Zurücksetzen einer Transaktion
1. Setzen Sie den Sicherungspunkt a
2. Nach dem Abbrechen des Sicherungspunkts a wird die Transaktion auf einen
zurückgesetzt . Alle Transaktions-Rollbacks abbrechen
Hinweis: Diese Rollback-Transaktion muss vor dem Festschreiben verwendet werden
public class UserRepository { private DataSource masterDataSource; private Connection connection = null; @Autowired public void setMasterDataSource(DataSource masterDataSource) { this.masterDataSource = masterDataSource; } @Transactional public boolean save(User user) { try { connection = masterDataSource.getConnection(); connection.setAutoCommit(false); //设置保护点 Savepoint saveUser = connection.setSavepoint("saveUser"); PreparedStatement prepareStatement = connection.prepareStatement("insert into user(id,name,age) values(?,?,?)"); prepareStatement.setLong(1, user.getId()); prepareStatement.setString(2, user.getName()); prepareStatement.setInt(3, user.getAge()); prepareStatement.execute(); try { update(user); } catch (Exception e) { System.out.println("出错了。。"+e); //回滚至保护点 connection.rollback(saveUser); } connection.commit(); } catch (SQLException e) { e.printStackTrace(); } finally { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } return true; } public boolean update(User user) { System.out.println("save user:"+user); try { PreparedStatement prepareStatement = connection.prepareStatement("update user set name = ? ,age = ? where id = ?)"); prepareStatement.setLong(3, user.getId()); prepareStatement.setString(1, "王大拿"); prepareStatement.setInt(2, 100/0); prepareStatement.execute(); connection.commit(); } catch (SQLException e) { e.printStackTrace(); } return true; } }
Bitte korrigieren Sie mich, wenn der obige Inhalt Fehler enthält !
Weitere Fragen zu MySQL finden Sie auf der chinesischen PHP-Website: MySQL-Video-Tutorial
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in SpringBoot-Transaktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!