Java的事务控制

交易

“事务是将一系列操作作为一个整体进行处理的逻辑单位。如果属于同一个事务的SQL处理有多个的话”

    • すべてが成功して初めて処理結果を確定する(コミット)

 

    途中で失敗したら、トランザクション実行前の状態に戻す(ロールバック)

在数据库中,将处理结果确认为commit,将状态恢复到执行之前的状态称为rollback。

使用交易

在Java中,提供了一个专门用于数据库操作的API,称为JBDC(Java DataBase Connectivity)。要使用JBDC指示事务控制,需要使用Connection对象。

1. 在连接建立后立即设置自动提交()-接连接
2. 在连接建立后立即设置自动提交()-接连接
3. 建立连接后立即设置自动提交()-接连接
4. 连接建立后立即设置自动提交()-接连接
5. 确立连接后立即设置自动提交()-接连接

在JBDC中,默认情况下,SQL在每次发送时都会自动提交,进入自动提交模式。您可以通过执行以下声明来明确进行事务控制。

    con.setAutoCommit(false); : 自動コミットモードの解除

并且,通过执行以下声明,您可以自动将其提交回自动提交模式。

    con.setAutoCommit(true); : 自動コミットモードの設定

2. 执行完一连串的SQL后

当您发送完毕涉及的所有SQL语句来执行一系列事务时,请调用commit函数进行提交。

    com.commit(); : 送信済みの処理要求の確定(コミット)

通过这个调用,被发送自上次commit()以来的所有SQL请求被视为一个事务,并且执行结果被确定。

当检测到异常情况时,执行回滚操作。

如果在发送多个SQL请求的过程中检测到异常,并且出于某种原因想要取消处理,可以使用rollback()函数。

    con.rollack(); : 送信済みの処理要求をキャンセル(ロールバック)

通过这个调用,commit()之后发送的所有SQL请求都将回滚。另外,即使在程序中没有显式调用rollback,在数据库连接中断、Java程序或数据库强制终止导致最终没有发出commit()时,数据库将自动执行回滚操作。

示例代码

import java.sql.*;


public class Main {
    public static void main(String[] args) {

        try {
            // JDBCドライバーの有効化
            Class.forName("org.h2.Driver");
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        }

        Connection con = null;
        try {
            // データベースの接続
            con = DriverManager.getConnection("jdbc:j2:~/rpgdb");  // JDBC URLを指定
            // オートコミット解除
            con.setAutoCommit(false);

            /** SQL発行処理(省略) */

            // トランザクションのコミット
            con.commit();
            // SQLExceptionが発生した場合の処理
        } catch(SQLException e) {
            try {
                // トランザクションのロールバック
                con.rollback();
            } catch (SQLException e2) {
                // スタックトレースを出力
                e2.printStackTrace();
            }
        } finally {
            if(con != null) {
                try {
                    // オートコミット有効化
                    con.setAutoCommit(true);
                    // データベース接続の切断
                    con.close();
                } catch(SQLException e3) {
                    // スタックトレースを出力
                    e3.printStackTrace();
                }
            }
        }
    }
}



bannerAds