νΈλμμ
λ°μ΄ν°λ² μ΄μ€μ μνλ₯Ό λ³νμν€λ νλμ λ Όλ¦¬μ κΈ°λ₯μ μννκΈ° μν μμ λ¨μ λλ ν λ²μ λͺ¨λ μνλμ΄μΌ ν μΌλ ¨μ μ°μ°
λ°μ΄ν°λ² μ΄μ€ μμ€ν μμ λ³ν μ μ΄ λ° ν볡 μμ μ μ²λ¦¬λλ λ Όλ¦¬μ λ¨μ
μ¬μ©μκ° μμ€ν μ λν μλΉμ€ μꡬ μ μμ€ν μ΄ μλ΅νκΈ° μν μν λ³ν κ³Όμ μ μμ λ¨μ
νΈλμμ μ νΉμ§(ACID)
1) μμμ±(Atomic)
ALL OR NOTHING
- νΈλμμ μ ν κ° μ΄μμ λμμ λ Όλ¦¬μ μΌλ‘ ν κ°μ μμ λ¨μλ‘ λ¬Άμ
- μμμ±μ νΈλμμ λ²μμ μλ λͺ¨λ λμμ΄ λͺ¨λ μ€νλκ±°λ λͺ¨λ μ€νμ΄ μ·¨μλ¨μ 보μ₯
2) μΌκ΄μ± (Consistent)
νΈλμμ μ΄ μ’ λ£λλ©΄, μμ€ν μ λΉμ¦λμ€μμ κΈ°λνλ μνκ° λ¨
μλ₯Ό λ€μ΄, μμ ꡬ맀 νΈλμμ μ΄ μ±κ³΅μ μΌλ‘ μ€νλλ©΄ κ²°μ λ΄μ, ꡬ맀λ΄μ, μκ³ μ λ³΄κ° λΉμ¦λμ€μ λ§κ² μ μ₯λκ³ λ³κ²½λ¨.
3) κ³ λ¦½μ±(Isolated)
- νΈλμμ μ λ€λ₯Έ νΈλμμ κ³Ό λ 립μ μΌλ‘ μ€νλμ΄μΌ νλ©°, μλ‘ λ€λ₯Έ νΈλμμ μ΄ λμΌν λ°μ΄ν°μ λμμ μ κ·Ό ν κ²½μ° μλ§κ² λμ μ κ·Όμμ μ΄.
- λμ μ κ·Ό μ μ΄λ μ€μ ν 격리 λ 벨μ λ°λΌ λ¬λΌμ§.
4) μ§μμ±(Durable)
- νΈλμμ
μ΄ μλ£λλ©΄, κ·Έ κ²°κ³Όλ μ§μμ μΌλ‘ μ μ§λμ΄μΌ ν¨.
- νμ¬μ μ΄ν리μΌμ΄μ
μ΄ λ³κ²½λκ±°λ μμ΄μ§λλΌλ λ°μ΄ν°λ μ μ§λ¨.
- μΌλ°μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€λ λ€λ₯Έ 물리μ μΈ μ μ₯μλ₯Ό ν΅ν΄μ νΈλμμ
κ²°κ³Όκ° μ μ₯λ¨
νΈλμμ μμ λ° μ’ λ£
1) νΈλμμ μμ
μ€ν κ°λ₯ν SQLλ¬Έμ₯μ΄ κ°μ₯ λ¨Όμ μ€νλ λ
2) νΈλμμ μ’ λ£
- COMMIT(νΈλμμ μλ£) μ΄λ ROLLBACK(νΈλμμ μ·¨μ) μ€ν
- DDLμ΄λ DCLλ¬Έμ₯μ μ€ν(μλ COMMIT)
- κΈ°κ³ μ₯μ λλ μμ€ν
μΆ©λ(crash)
- Deadlock λ°μ
-μ μμ’ λ£
νΈλμμ μ μλ COMMIT λ° μλ ROLLBACK
1) μλ COMMIT
- DDL,DCLλ¬Έμ₯μ΄ μλ£ λ λ
- λͺ μμ μΈ COMMITμ΄λ ROLLBACKμμ΄ SQL*Plusλ₯Ό μ μ μ’ λ£ νμ κ²½μ°
2) μλ ROLLBACK
- SQL*Plusλ₯Ό λΉμ μ μ’ λ£ νμ κ²½μ°
-λΉμ μμ μΈμ’ λ£λ±
νΈλμμ μ²λ¦¬ μμ
ν λ©μλ μμ λ κ° μ΄μμ sql 쿼리문μ μ€νν΄μΌ ν λ,
νλκ° μ²λ¦¬ λμ§ μμΌλ©΄ λ€λ₯Έ νλλ μ²λ¦¬ λμ§ μλλ‘ rollback ν΄μ£ΌκΈ° μν΄ μ¬μ©
conn.setAutoCommit(false);
μλ°μμ DML 쿼리λ₯Ό μ€ννλ©΄ κΈ°λ³Έμ μΌλ‘ COMMIT λλ€.
Connection κ°μ²΄ connμ μλ 컀λ°λμ§ μλλ‘ μ€μ
conn.commit();
μμΈκ° λ°μνμ§ μμλ€λ©΄ 컀λ°.
μμΈκ° λ°μνλ€λ©΄ rollbackνκΈ° μν΄ μμΈ μ²λ¦¬ λ¬Έμ rollbackμ μ¬μ©νλ€.
νΈλμμ μ½λ μμ
μΈκ°μ ν
μ΄λΈμ΄ λͺ¨λ λ±λ‘λκ±°λ, νλμ ν
μ΄λΈμ΄λΌλ λ±λ‘λμ§ μμΌλ©΄ λͺ¨λ λ±λ‘λμ§ μλλ‘ μ½λ©
μ νλ²νΈ μ
λ ₯νμ§ μκ³ μν° μΉλ©΄ λͺ¨λ ν
μ΄λΈμ΄ λ±λ‘λμ§ μμ
package db.ch5;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import db.util.DBConn;
public class Ex_Transaction {
public static void main(String[] args) {
// νΈλμμ
μμ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
String sql;
String id, name, birth, tel;
try {
System.out.println("μμ΄λ?");
id = br.readLine();
System.out.println("μ΄λ¦?");
name = br.readLine();
System.out.println("μλ
μμΌ?");
birth = br.readLine();
System.out.println("μ νλ²νΈ?");
tel = br.readLine();
conn.setAutoCommit(false);
sql = "INSERT INTO test1(id, name) VALUES(?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, name);
pstmt.executeUpdate();
pstmt.close();
pstmt = null;
sql = "INSERT INTO test2(id, birth) VALUES(?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, birth);
pstmt.executeUpdate();
pstmt.close();
pstmt = null;
sql = "INSERT INTO test3(id, tel) VALUES(?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, tel);
pstmt.executeUpdate();
pstmt.close();
pstmt = null;
// 컀λ°
conn.commit();
System.out.println("λ°μ΄ν° μΆκ° μ±κ³΅ ");
} catch (SQLException e) {
// λ‘€λ°±
try {
conn.rollback();
} catch (Exception e2) {
}
System.out.println("λ°μ΄ν° μΆκ° μ€ν¨");
} catch (Exception e2) {
e2.printStackTrace();
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
try {
// λ€μ 컀λ°λλλ‘ μ€μ
conn.setAutoCommit(true);
} catch (Exception e) {
// TODO: handle exception
}
DBConn.close();
}
}
}
'π»Programming > βοΈJava' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
CallableStatement νμ©(1) - μ€λΌν΄ νλ‘μμ (0) | 2022.08.23 |
---|---|
CallableStatement (0) | 2022.08.23 |
PreparedStatement νμ© (0) | 2022.08.22 |
PreparedStatement (0) | 2022.08.22 |
Statement (0) | 2022.08.19 |