주의하여 Oracle 저장 프로 시저에서 커밋 사용

목차

I. 소개

둘째, 테스트 예제 만들기

1 데모 테이블 생성

2 데이터 삽입

3 저장 프로 시저 만들기

4 자바 함수 생성

셋, 테스트

1Java 함수에서 예외가 발생하고 스토리지에 커밋이 없습니다.

2java 함수에서 예외가 발생하고 저장소에 커밋이 있습니다.

네, 요약


I. 소개

Oracle 저장 프로 시저의 커밋이 프로그램 실행 결과에 미치는 영향을 테스트합니다.

둘째, 테스트 예제 만들기

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;

4 자바 함수 생성

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

}

셋, 테스트

1Java 함수에서 예외가 발생하고 스토리지에 커밋이 없습니다.

데이터베이스 변경 없음, 일반 절차

2java 함수에서 예외가 발생하고 저장소에 커밋이 있습니다.

프로그램은 널 포인터 예외를 발생시키고 트랜잭션을 커밋하지 않습니다. 커밋되지 않은 트랜잭션의 경우 데이터베이스에 데이터가 삽입되지 않습니다.

데모 테이블의 데이터를 살펴보면 데이터가 부분적으로 성공한 것으로 예상되는 결과가 아님을 알 수 있습니다.

네, 요약

저장 프로 시저에서주의해서 commit을 사용하십시오.

추천

출처blog.csdn.net/cs373616511/article/details/109547812