Oracleストアドプロシージャでcommitを使用する場合は注意が必要です

目次

I.はじめに

2つ目は、テスト例を作成する

1デモテーブルを作成します

2データを挿入

3ストアドプロシージャを作成します

4Java関数を作成します

3、テスト

1java関数が例外をスローし、ストレージにコミットがありません

2java関数が例外をスローし、ストレージにコミットがあります

4、まとめ


I.はじめに

プログラムの実行結果に対するOracleストアドプロシージャのコミットの影響をテストします。

2つ目は、テスト例を作成する

1デモテーブルを作成します

CREATE TABLE "SCOTT"."DEMO" (
  "ID" NUMBER NOT NULL ,
  "DESC" VARCHAR2(255 BYTE) 
)

2データを挿入

INSERT INTO "SCOTT"."DEMO" VALUES ('1', 'a');

3ストアドプロシージャを作成します

CREATE OR REPLACE PROCEDURE "P_C"  (a in VARCHAR2)
AS
C_ID NUMBER;
BEGIN
	select max(id)+1 into C_ID from demo;
	insert into DEMO VALUES (C_ID,'a');
	commit;
	
	insert into DEMO VALUES (888,'a');

END;

4Java関数を作成します

public static void main(String[] args) throws Exception {
        String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
        String user = "scott";
        String password = "root";
        // 连接数据库
        Connection con = DriverManager.getConnection(url, user, password);
        con.setAutoCommit(false);
        Statement statement = null;
        CallableStatement st = null;
        try {
            System.out.println(con);
            String sql2 = "insert into DEMO VALUES ((select max(id)+1 from demo),'a')";
            statement = con.createStatement();
            statement.execute(sql2);

            //调用存储过程
            String sql = "{call P_C(?)}";
            st = con.prepareCall(sql);
            st.setObject(1, "a");
            st.execute();

            //其它业务逻辑-模拟业务异常
            String a = null;
            System.out.println(a.length());

            //提交事务
            con.commit();
        } catch (Exception e) {
            e.printStackTrace();
            con.rollback();
        } finally {
            statement.close();
            st.close();
            con.close();
        }

}

3、テスト

1java関数が例外をスローし、ストレージにコミットがありません

データベースへの変更なし、通常の手順

2java関数が例外をスローし、ストレージにコミットがあります

プログラムはnullポインタ例外をスローし、トランザクションをコミットしません。コミットされていないトランザクションの場合、データベースにデータは挿入されません。

デモテーブルのデータを見ると、データが部分的に成功していることがわかりますが、これは期待した結果ではありません。

4、まとめ

ストアドプロシージャでは、commitを慎重に使用してください。

おすすめ

転載: blog.csdn.net/cs373616511/article/details/109547812