Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
JDBC-illesztőprogram letöltése
A Savepoints egy mechanizmust kínál a tranzakciók egyes részeinek visszaállítására. Az SQL Serveren belül a SAVE TRANSACTION savepoint_name utasítással hozhat létre mentési pontot. Később futtat egy ROLLBACK TRANSACTION savepoint_name utasítást, amely ahelyett, hogy visszagörget a tranzakció elejére, visszaállítja a mentési pontokat.
A mentési pontok olyan helyzetekben hasznosak, amikor nem valószínű, hogy hibák lépnek fel. A savepoint használata a tranzakció egy részének visszaállítására ritka hiba esetén hatékonyabb lehet, mint ha minden egyes tranzakció ellenőrizné a frissítés érvényességét annak végrehajtása előtt. A frissítések és a visszaállítások költséges műveletek, ezért a mentési pontok csak akkor hatékonyak, ha a hiba előfordulásának valószínűsége alacsony, és a frissítések érvényességének előzetes ellenőrzésének költsége viszonylag magas.
Az SQL ServerHez készült Microsoft JDBC-illesztőprogram az SQLServerConnection osztály setSavepoint metódusával támogatja a mentési pontok használatát. A setSavepoint metódus használatával létrehozhat egy elnevezett vagy névtelen mentési pontot az aktuális tranzakcióban, és a metódus egy SQLServerSavepoint-objektumot ad vissza. Egy tranzakción belül több mentési pont is létrehozható. Ha vissza szeretne állítani egy tranzakciót egy adott mentési pontra, az SQLServerSavepoint objektumot átadhatja a visszaállítási (java.sql.Savepoint) metódusnak.
Az alábbi példában egy savepointot használunk a blokk két különálló utasításából try álló helyi tranzakció végrehajtása során. Az utasítások az AdventureWorks2025 mintaadatbázis Production.ScrapReason táblájában futnak, a második utasítás visszaállításához pedig egy savepointot használunk. Ez azt eredményezi, hogy csak az első utasítás lesz mentett az adatbázisba.
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();
}
}
}