Mentési pontok használata

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();
        }
    }
}

Lásd még

Tranzakciók végrehajtása a JDBC-illesztőprogrammal