Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Savepoints erbjuder en mekanism för att återställa delar av transaktioner. I SQL Server kan du skapa en sparpunkt med hjälp av instruktionen SAVE TRANSACTION savepoint_name. Senare kör du en ROLLBACK TRANSACTION-savepoint_name-instruktion för att återställa till sparandepunkten i stället för att återställa till början av transaktionen.
Savepoints är användbara i situationer där fel sannolikt inte kommer att inträffa. Det kan vara effektivare att använda en sparad punkt för att återställa en del av en transaktion vid ett sällan förekommande fel än att ha varje transaktionstest för att se om en uppdatering är giltig innan uppdateringen görs. Uppdateringar och återställningar är dyra åtgärder, så sparpunkter är endast effektiva om sannolikheten för att stöta på felet är låg och kostnaden för att kontrollera giltigheten för en uppdatering i förväg är relativt hög.
Microsoft JDBC-drivrutinen för SQL Server stöder användning av sparandepunkter via setSavepoint-metoden för KLASSEN SQLServerConnection . Med metoden setSavepoint kan du skapa en namngiven eller namnlös sparandepunkt i den aktuella transaktionen, och metoden returnerar ett SQLServerSavepoint-objekt . Flera sparandepunkter kan skapas i en transaktion. Om du vill återställa en transaktion till en viss savepoint kan du skicka SQLServerSavepoint-objektet till metoden rollback (java.sql.Savepoint).
I följande exempel används en sparpunkt när du utför en lokal transaktion som består av två separata instruktioner i try blocket. Instruktionerna körs mot tabellen Production.ScrapReason i exempeldatabasen AdventureWorks2025, och en sparpunkt används för att rulla tillbaka den andra instruktionen. Detta resulterar i att bara den första instruktionen commitas i databasen.
public static void executeTransaction(Connection con) {
try(Statement stmt = con.createStatement();) {
con.setAutoCommit(false);
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Correct width')");
Savepoint save = con.setSavepoint();
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong width')");
con.rollback(save);
con.commit();
System.out.println("Transaction succeeded.");
}
catch (SQLException ex) {
ex.printStackTrace();
try {
System.out.println("Transaction failed.");
con.rollback();
}
catch (SQLException se) {
se.printStackTrace();
}
}
}