database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
ㆍCUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
CUBRID Q&A 533 게시물 읽기
No. 533
Q.저장프로시져에서 Transaction 이 않되네요...
작성자
다트25
작성일
2007-09-11 17:28
조회수
2,978

    public static void Ins_INFO_test( String reg_time, String name, String id) throws Exception

    {

        Connection conn = null;

        PreparedStatement pstmt = null;

 

        String sql = \"\";

 

        try

        {

            Class.forName(\"cubrid.jdbc.driver.CUBRIDDriver\");

 

            conn = DriverManager.getConnection(\"jdbc:cubrid:localhost:33000:testDB:::\",\"dba\",\"\");

 

            //

            sql = \"insert into p_info (reg_time, name, reg_num) values (?, ?, \'1111111111111\') to :X \";

 

            pstmt = conn.prepareStatement(sql);

 

            pstmt.setString(1, reg_time   );

            pstmt.setString(2, name       );

            pstmt.executeUpdate();

            pstmt.close();

            //

            sql = \"insert into m_in_info (p_info_oid, address, reg_time) values (:X, \'101-101\',  ?) \";

 

            pstmt = conn.prepareStatement(sql);

            pstmt.setString(1, reg_time.substring(1, 14));

            pstmt.executeUpdate();

            pstmt.close();

 

            //

            sql = \"insert into m_info (id, passwd, personal_info_oid, use_yn) values(?, \'111\', :X, \'Y\') \";

 

            pstmt = conn.prepareStatement(sql);

 

            pstmt.setString(1, id         );

            pstmt.executeUpdate();

            pstmt.close();

 

            conn.commit();

            conn.close();

        }

        catch (SQLException e)

        {

            System.err.println(e.getMessage());

 

            pstmt.close();

            conn.rollback();

            conn.close();

        }

    }

 

위와 같이 해서 첫번째와 두번째 테이블에는 데이터가 입력이 되었습니다.

그런데 세번째 테이블에는 에러가 생겨 입력이 안되었습니다.

그러면 모두 rollback되어야 하는거 아닌가요?

 

그리고 세번째 테이블에 무슨 에러가 발생했는지 알수 가 없습니다.

큐브리드 메니저에서 로그에 아무것도 나타나지 않았습니다.

이 글에 대한 댓글이 총 1건 있습니다.

큐브리드는 default로 autocommit의 true입니다.

따라서 아래와 같이 수행하였을 경우 건건이 커밋이 이루어지기 때문에 정상처리된 두 건에 대해서는 저장되고 나머지 한 건은 에러가 발생하는 것이 맞습니다.

생성된 connection에 대해 자동커밋을 해재해야만이 전체 트랜잭션에 대한 처리가 이루어집니다.

conn.setAutoCommit(false); 구문을 connection 얻은 이후에 추가하시면 됩니다.

 

참고로 저장프로시져에서 DB에 connection을 얻어올때

DriverManager.getConnection(“jdbc:default:connection:”); 을 사용하는 경우는 서버측 내부 JDBC 드라이버를 사용하는 경우로 이러한 경우에는 프로시져 내부에 존재하는 트랜잭션관련된 사항은 모두 무시되고 프로시져를 호출한 트랜잭션에 영향을 받습니다.

하지만 아래 작성하신 DriverManager.getConnection\"jdbc:cubrid:localhost:33000:testDB:::\",\"dba\",\"\"); 경우와 같이 외부 JDBC드라이버를 사용하는 경우에는 프로시져 내부에 명시된 트랜잭션 관련된 사항이 적용됩니다.

 

 

>    public static void Ins_INFO_test( String reg_time, String name, String id) throws Exception

>    {

>        Connection conn = null;

>        PreparedStatement pstmt = null;

>

>        String sql = \"\";

>

>        try

>        {

>            Class.forName(\"cubrid.jdbc.driver.CUBRIDDriver\");

>

>            conn = DriverManager.getConnection(\"jdbc:cubrid:localhost:33000:testDB:::\",\"dba\",\"\");

>

>            //

>            sql = \"insert into p_info (reg_time, name, reg_num) values (?, ?, \'1111111111111\') to :X \";

>

>            pstmt = conn.prepareStatement(sql);

>

>            pstmt.setString(1, reg_time   );

>            pstmt.setString(2, name       );

>            pstmt.executeUpdate();

>            pstmt.close();

>            //

>            sql = \"insert into m_in_info (p_info_oid, address, reg_time) values (:X, \'101-101\',  ?) \";

>

>            pstmt = conn.prepareStatement(sql);

>            pstmt.setString(1, reg_time.substring(1, 14));

>            pstmt.executeUpdate();

>            pstmt.close();

>

>            //

>            sql = \"insert into m_info (id, passwd, personal_info_oid, use_yn) values(?, \'111\', :X, \'Y\') \";

>

>            pstmt = conn.prepareStatement(sql);

>

>            pstmt.setString(1, id         );

>            pstmt.executeUpdate();

>            pstmt.close();

>

>            conn.commit();

>            conn.close();

>        }

>        catch (SQLException e)

>        {

>            System.err.println(e.getMessage());

>

>            pstmt.close();

>            conn.rollback();

>            conn.close();

>        }

>    }

>

>위와 같이 해서 첫번째와 두번째 테이블에는 데이터가 입력이 되었습니다.

>그런데 세번째 테이블에는 에러가 생겨 입력이 안되었습니다.

>그러면 모두 rollback되어야 하는거 아닌가요?

>

>그리고 세번째 테이블에 무슨 에러가 발생했는지 알수 가 없습니다.

>큐브리드 메니저에서 로그에 아무것도 나타나지 않았습니다.

 

손승일님이 2007-09-12 10:48에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
536Q.unload 한 데이터를 load시 Could not access Glo data.... 오류 [1]
고은배
2007-09-13
3032
535Q.세그멘테이션 오류 문의입니다. [1]
염준헌
2007-09-12
3505
534Q.여러 데이터베이스 취합 후 배포가 가능한가요? [1]
홍순필
2007-09-12
2905
533Q.저장프로시져에서 Transaction 이 않되네요... [1]
다트25
2007-09-11
2978
532Q.CCI 라이브러리만 옛날 컴파일러 지원해주실 수 있으신지요. [1]
눈큰아이
2007-09-11
2797
528Q.실행 오류 번호로 에러내용확인... [1]
다트25
2007-09-10
2946
527Q.저장 프로시져에 대한 예제가 필요합니다. [1]
다트25
2007-09-10
2909
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다