目次
1java関数が例外をスローし、ストレージにコミットがありません
2java関数が例外をスローし、ストレージにコミットがあります
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を慎重に使用してください。