#java.sql.Savepoint

# 描述

java.sql.Savepoint用来表示保存点对象,Savepoint可以是命名的,也可以是未命名的。实例通过Connection.setSavepoint()方法创建,仅在事务未提交或未回滚时有效。核心作用是:

  • 在一个活跃的数据库事务中创建“保存点”,将一个大事务拆分为多个可独立回滚的小片段。
  • 支持回滚到指定保存点(仅撤销保存点之后的操作,保存点之前的操作仍保留)。
  • 可手动释放不再需要的保存点,节省数据库资源。

详细接口说明请参考JDBC官方网站 (opens new window)。

# 方法

YashanDB JDBC驱动对Savepoint接口有如下方法:

方法 返回类型 备注
getSavepointId() int 只有未命名的保存点可以调用,否则会抛异常。
getSavepointName() String 只有命名的保存点可以调用,否则会抛异常。

# 示例

package quickstart;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.util.Properties;

public class SavepointExample {

    public static Connection getConnection()
            throws SQLException, ClassNotFoundException {
        String url = "jdbc:yasdb://192.168.1.2:1688/yasdb";
        Properties info = new Properties();
        info.setProperty("user", "username");
        info.setProperty("password", "passwd");
        Class.forName("com.yashandb.jdbc.Driver");
        return DriverManager.getConnection(url, info);
    }

    public static void main(String[] args) throws Exception {
        try (Connection conn = getConnection()) {
            new SavepointExample().conditionalRollback(conn);
        }
    }

    // 条件回滚到保存点
    public void conditionalRollback(Connection conn) throws SQLException {
        conn.setAutoCommit(false);

        Savepoint checkpoint1 = conn.setSavepoint("CHECKPOINT_1");
        System.out.println("Checkpoint 1: " + checkpoint1.getSavepointName());

        // 执行若干业务操作
        boolean success = performOperation(conn);

        if (!success) {
            // 回滚至指定保存点
            conn.rollback(checkpoint1);
            System.out.println("Operation failed, rolled back to: " +
                    checkpoint1.getSavepointName());
        } else {
            Savepoint checkpoint2 = conn.setSavepoint();
            System.out.println("Checkpoint 2 ID: " + checkpoint2.getSavepointId());

            // 继续后续执行逻辑……
        }

        conn.commit();
        conn.setAutoCommit(true);
    }

    private boolean performOperation(Connection conn) throws SQLException {
        // 执行业务操作
        return true;
    }
}

正常情况下,程序输出如下:

Checkpoint 1: CHECKPOINT_1
Checkpoint 2 ID: 1
pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流