Java 트랜잭션 관리 학습의 JDBC 상세 정보
통상적인 관념에 따르면 사무는 데이터베이스와 관련이 있을 뿐이다.
트랜잭션은 ISO/IEC에서 정한 ACID 지침에 따라야 합니다.ACID는 원자성(atomicity), 일치성(consistency), 격리성(isolation), 지속성(durability)의 줄임말이다.사무의 원자성은 사무 집행 과정 중의 어떠한 실패도 사무소가 한 모든 수정이 효력을 잃게 된다는 것을 나타낸다.일치성은 사무 집행이 실패했을 때 이 사무에 영향을 받은 모든 데이터가 사무 집행 전의 상태로 회복되어야 한다는 것을 나타낸다.격리성은 사무 집행 과정에서 데이터에 대한 수정을 나타내고 사무가 제출되기 전에 다른 사무를 볼 수 없음을 나타낸다.지속성은 이미 제출한 데이터가 업무 수행에 실패했을 때 데이터의 상태가 정확해야 한다는 것을 나타낸다.
통속적인 이해에 의하면 사무는 하나의 원자 조작 단원으로 데이터베이스 측면에서 보면 하나의 SQL 지령이다. 아니면 모두 실행에 성공하거나 어떤 원인으로 인해 하나의 지령이 잘못 실행되면 이전에 실행한 모든 지령을 취소한다.더 간단명료한 것은 모두 집행에 성공하든지 아니면 집행을 취소하든지 하는 것이다.
사무의 개념이 데이터베이스에서 나온 이상 자바 사무는 무엇입니까?무슨 연관이 있습니까?
실제로 자바 응용 시스템은 데이터베이스를 조작하려면 JDBC를 통해 이루어진다.추가, 수정, 삭제는 상응하는 방법을 통해 간접적으로 이루어지고 사무의 제어도 자바 프로그램 코드로 옮겨진다.따라서 데이터베이스 작업의 사무 습관상 자바 사무라고 부른다.
트랜잭션 특성:
1) 원자성(atomicity): 업무는 데이터베이스의 논리적 작업 단위이며, 반드시 원자 작업 단위여야 하며, 그 데이터에 대한 수정은 전부 실행하거나 전부 실행하지 않는다.
2) 일치성(consistency): 업무가 끝날 때 모든 데이터가 일치 상태를 유지해야 합니다.관련 데이터베이스에서 모든 규칙은 모든 데이터의 완전성을 유지하기 위해 사무의 수정에 적용해야 한다.
3) 격리성(isolation): 하나의 업무의 집행은 다른 사무소에 영향을 받을 수 없다.
4) 지속성(durability): 하나의 업무가 제출되면 사물의 조작은 DB에 영구적으로 저장된다.롤백 작업을 다시 수행해도 변경 사항을 취소할 수 없습니다.
트랜잭션(Transaction): 병렬 제어의 단원으로 사용자가 정의한 조작 시퀀스입니다.이 조작들은 모두 하든지 하지 않든지 분할할 수 없는 작업 단위이다.사무를 통해 sql 서버는 서버가 데이터의 완전성을 유지할 수 있도록 논리와 관련된 조작을 연결할 수 있습니다.업무는 보통begintransaction으로 시작하고commit이나rollback으로 끝납니다.Commint는 커밋, 즉 트랜잭션의 모든 작업을 커밋합니다.구체적으로 말하면 업무의 모든 데이터에 대한 업데이트를 디스크의 물리 데이터베이스로 쓰면 업무가 정상적으로 끝난다.롤백은 롤백을 표시합니다. 즉, 업무가 실행되는 과정에서 어떤 고장이 발생하여 업무를 계속 진행할 수 없습니다. 시스템은 업무에서 데이터베이스에 완성된 모든 작업을 취소하고 업무가 시작된 상태로 롤백합니다.
자동 사무 제출: 모든 단독 문장은 하나의 사무입니다.모든 문장 뒤에 하나의commit가 숨겨져 있다.(기본값)
현식 업무:begintransaction 디스플레이로 시작하고commit이나rollback으로 끝냅니다.
스텔스 사무: 연결이 스텔스 사무 모드로 동작할 때 sql 서버 데이터베이스 엔진 실례는 현재 사무를 제출하거나 롤백한 후 자동으로 새 사무를 시작합니다.사물의 시작을 묘사할 필요가 없고, 모든 사무를 제출하거나 스크롤하기만 하면 된다.그러나 모든 업무는commit이나rollback으로 현시적으로 끝난다.연결은 은밀한 사무 모드를 설정한 후 데이터베이스 엔진 실례가 다음 문장을 처음 실행할 때 자동으로 은밀한 사무를 시작합니다. altertable, insert,create,open,delete,revoke,drop,select,fetch,truncatetable,grant,update는commit나rollback 문장을 보내기 전까지 유효합니다.첫 번째 업무가 제출되거나 롤백된 후에 다음에 연결이 상기 문장을 실행할 때 데이터베이스 엔진 실례는 자동으로 새로운 업무를 시작합니다.이 실례는 은밀한 사무 패턴이 닫힐 때까지 은밀한 사무 체인을 끊임없이 생성할 것이다.
JDBC 트랜잭션 관리
JDBC를 사용할 때 어떻게 업무를 관리합니까?코드 바로 보시죠.
예제 코드
/**
* @Title: JDBCTrans.java
* @Package com.oscar999.trans
* @Description:
* @author XM
* @date Feb 14, 2017 4:38:27 PM
* @version V1.0
*/
package com.oscar999.trans;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author
*
*/
public class JDBCTrans {
public JDBCTrans() {
}
/**
*
* @param sHostName
* @param sPortNumber
* @param sSid
* @param userName
* @param password
* @return
* @throws SQLException
*/
public Connection getConnection(String sHostName, String sPortNumber, String sSid, String userName, String password) throws SQLException {
Connection conn = null;
String url = getOraclURL(sHostName, sPortNumber, sSid);
conn = DriverManager.getConnection(url,userName,password);
return conn;
}
/**
*
* @param conn
* @param sql
* @throws SQLException
*/
public void add(Connection conn, String sql) throws SQLException {
Statement stmt = null;
try {
stmt = conn.createStatement();
stmt.execute(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (stmt != null)
stmt.close();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String sHostName = "";
String sPortNumber = "";
String sSid = "";
String userName = "";
String password = "";
sHostName = "";
sPortNumber = "";
sSid = "";
userName = "";
password = "";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
JDBCTrans jdbcTrans = new JDBCTrans();
Connection conn = null;
try {
conn = jdbcTrans.getConnection(sHostName, sPortNumber, sSid, userName, password);
conn.setAutoCommit(false);// can't insert, update
//1. add SQL
String addSQL = "insert into TEST_TABLE values('name1','value1')";
jdbcTrans.add(conn,addSQL);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
/*if (conn != null)
{
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
}
}
private String getOraclURL(String sHostName, String sPortNumber, String sSid) {
String url = "jdbc:oracle:thin:@" + sHostName + ":" + sPortNumber + ":" + sSid;
return url;
}
}
위의 코드에 대한 설명은 다음과 같습니다.위의 코드는 다음과 같은 몇 가지 설명이 있습니다.
1.
conn.setAutoCommit(false)
집행 후 사무를 제출하지 않습니다.Select는 영향을 미치지 않지만 Insert 및 Update는 데이터를 제출하지 않으면 수정되지 않습니다.
2.
conn.close();
Connection을 닫는 코드가 마크에 의해 떨어진 것은 conn.setAutoCommit(false)
효과를 나타내려는 것이다.왜냐하면 Connection Close 때 Commit를 실행하기 때문입니다.
만약 Connection이 응용 서버에서 연결 탱크를 사용한다면 Connection은 닫히거나 Commit를 실행하지 않을 것입니다.
3.
setAutoCommit(false)
용법은 대부분 여러 문장을 집행해야 제출한다.그래서 상기 세 번째 점을 겨냥하여 실제 상황에 더욱 가까운 코드, 예를 들어 예시 코드 2
예제 코드 2
/**
* @Title: JDBCTrans.java
* @Package com.oscar999.trans
* @Description:
* @author XM
* @date Feb 14, 2017 4:38:27 PM
* @version V1.0
*/
package com.oscar999.trans;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author
*
*/
public class JDBCTrans {
public JDBCTrans() {
}
/**
*
* @param sHostName
* @param sPortNumber
* @param sSid
* @param userName
* @param password
* @return
* @throws SQLException
*/
public Connection getConnection(String sHostName, String sPortNumber, String sSid, String userName, String password) throws SQLException {
Connection conn = null;
String url = getOraclURL(sHostName, sPortNumber, sSid);
conn = DriverManager.getConnection(url, userName, password);
return conn;
}
/**
*
* @param conn
* @param sql
* @throws SQLException
*/
public void add(Connection conn, String sql) throws SQLException {
Statement stmt = null;
try {
stmt = conn.createStatement();
stmt.execute(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (stmt != null)
stmt.close();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String sHostName = "";
String sPortNumber = "";
String sSid = "";
String userName = "";
String password = "";
sHostName = "";
sPortNumber = "";
sSid = "";
userName = "";
password = "";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
JDBCTrans jdbcTrans = new JDBCTrans();
Connection conn = null;
try {
conn = jdbcTrans.getConnection(sHostName, sPortNumber, sSid, userName, password);
conn.setAutoCommit(false);// can't insert, update
// 1. add SQL 1
String addSQL = "insert into TEST_TABLE values('name1','value1')";
jdbcTrans.add(conn, addSQL);
//2. add SQL 2
addSQL = "insert into TEST_TABLE values('name2','value2')";
jdbcTrans.add(conn, addSQL);
conn.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
if(conn!=null){
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private String getOraclURL(String sHostName, String sPortNumber, String sSid) {
String url = "jdbc:oracle:thin:@" + sHostName + ":" + sPortNumber + ":" + sSid;
return url;
}
}
여기서 설명해야 할 것은: conn.rollback();
실행에 이상이 있으면rollback을 해야 합니다. 이 단계는 반드시 없어서는 안 됩니다.실행에 이상이 없을 때 롤백하지 않았습니다.첫 번째 문장을 실행한 후에 이상이 발생하면con은 제출도 롤백도 하지 않고 테이블이 잠겨 있습니다. (oracle 데이터베이스가 줄 자물쇠라면) 이 자물쇠는 풀 기회가 없습니다.
실행
con.close()
시 자물쇠를 풀 수 있지만 응용 서버가 데이터베이스 연결 탱크를 사용하면 연결이 끊어지지 않습니다.총결산
이상은 이 글의 전체 내용입니다. 본고의 내용이 여러분들이 자바를 배우거나 사용하는 데 어느 정도 도움이 되기를 바랍니다. 의문이 있으면 댓글로 교류해 주십시오. 저희에 대한 지지에 감사드립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.