#20 JDBC νΈλμμ (Spring -@Transaction)
Springμ @Transactionμ΄ μ΄λ»κ² λμνλμ§ μ΄ν΄νκΈ° μν΄ JDBCμ νΈλμμ μ λν΄ κ³΅λΆν΄λ΄ μλ€.
JDBCμ μ¬μ©λ²μ μ΄κΈμμ λ€λ£¨μ§ μμ΅λλ€. μλκΈμ μ°Έκ³ ν΄μ£ΌμΈμ.
2021.07.21 - [Backend/Java] - #19 JDBC
#19 JDBC
# JDBC? (Java Database Connectivity) Java μ½λμμ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νκΈ° μν΄ μ 곡ν΄μ£Όλ API. μ°Έκ³ λ‘ JDBCκ° λμ€κΈ° μ΄μ μλ MSμ§ν ( CμΈμ΄)μμ λ§λ ODBC API (Open DB Connectivity)λ₯Ό μ 곡νμλ€...
jiwondev.tistory.com
#1. Transaction μ΄λ
νΈλμμ (Transaction)μ DBμ μνλ₯Ό λ³νμν€λ νλμ μμ λ¨μ (λλ νλ²μ λͺ¨λ μνν΄μΌν μ°μ°λ€)μ μλ―Ένλ€. νΈλμμ μ μ€κ³ν λμλ λ°λμ ACID μμΉμ μ§μΌμΌ νλ€.
μ°μ Transactionμ μλ―Έλ 'κ±°λ', μ¦ μνμμ μ¬μ©νλ κ±°λμ κ°μ μλ―Έμ λλ€.
νΈλμμ μ νμμ±μ μ΄ν΄νκΈ° μν΄ [μνκ° μ‘κΈ μμ€ν ]μ λ€μκ³Ό κ°μ λ¬Έμ κ° μκ²Όλ€κ³ κ°μ ν΄λ΄ μλ€.
1. Aμνμμ BμνμΌλ‘ μ‘κΈν©λλ€.
2. Aμνμμ μ‘κΈμ΄ μ±κ³΅νμκ³ , Bμνμμ λ°λ μμ€ μ€λ₯κ° λ°μνμ¬ μ κΈλ°μ§ λͺ»νμ΅λλ€.
μ΄λ₯Ό λ¬Έμ μμ΄ λ³΅κ΅¬νκΈ° μν΄μ μ΄λ»κ² ν΄μΌν κΉμ? Aμ μ°λ½μ λ€μν΄μ ν΄λΉκ±°λλ₯Ό μ·¨μνκ³ , μ€λ₯κ° ν΄κ²° λ λ€μ μ κΈλλ©΄ μλλ Bμ μ κΈλλλΌλ 무μν΄λ¬λΌκ³ μ°λ½ν΄μΌν κΉμ? μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκ³ λ°μ΄ν°μ μμ μ±, 무결μ±μ ν보νλ λ°©λ²μ΄ 'νΈλμμ ' λ¨μ μ²λ¦¬μ λλ€.
λ°μ΄ν°λ² μ΄μ€μμλ κ°κ°μ μμ μ 'νΈλμμ ' λ¨μλ‘ κ΄λ¦¬νλ©° νΈλμμ μ΄ μ μ μλ£λμ§μμλ€λ©΄ μμ νλ κ³Όμ λ€μ μ λΆ μμνλ‘ λλ립λλ€. (= ν νΈλμμ μμ μΌλΆλ§ μλ£λλ κ²½μ°λ μμ΅λλ€.)
μ μμ μμμ ν νΈλμμ μ [ Aμν μ‘κΈ -> Bμν μμ -> κ±°λμλ£ ] μ΄λΌκ³ λ³Ό μ μμ΅λλ€.
Atomicity(μμμ±) - νΈλμμ μ λ μ΄μ μμ λ¨μλ‘ μͺΌκ°€ μ μλ€.
- ν νΈλμμ λ΄μ λͺ¨λ λͺ λ Ήμ λ°λμ μλ²½ν μνλμ΄μΌ νλ©°, λͺ¨λκ° μλ²½ν μνλμ§ μκ³ μ΄λνλλΌλ μ€λ₯κ° λ°μνλ©΄ νΈλμμ μ λΆκ° μ·¨μλμ΄μΌ νλ€. λΆλΆ μλ£λ λΆκ°λ₯νλ€.
- λ³΄ν΅ νΈλμμ μ±κ³΅ μ°μ°μ Commit(컀λ°), μ€ν¨ μ°μ°μ Rollback(λλ Aborted) λΌ λΆλ₯Έλ€.
Consistency(μΌκ΄μ±) - νΈλμμ μ μΈμ λ κ°μ μ λ ₯μλ κ°μ κ²°κ³Όκ° λμμΌνλ€.
- νΈλμμ μ΄ κ·Έ μ€νμ μ±κ³΅μ μΌλ‘ μλ£νλ©΄ μΈμ λ μΌκ΄μ± μλ λ°μ΄ν°λ² μ΄μ€ μνλ‘ λ³ννλ€.
- μμ€ν μ΄ κ°μ§κ³ μλ κ³ μ μμλ νΈλμμ μν μ κ³Ό νΈλμμ μν μλ£ νμ μνκ° κ°μμΌ νλ€.
Isolation(λ 립μ±,격리μ±) - κ°κ°μ νΈλμμ μ λ 립μ μ΄λ€. μ€ν μ€ μλ‘ μν₯λΌμΉμ§ μλλ€.
- λ μ΄μμ νΈλμμ μ΄ λμμ λ³ν μ€νλλ κ²½μ° μ΄λ νλμ νΈλμμ μ€νμ€μ λ€λ₯Έ νΈλμμ μ μ°μ°μ΄ λΌμ΄λ€ μ μλ€.
- μνμ€μΈ νΈλμμ μ μμ ν μλ£λ λκΉμ§ λ€λ₯Έ νΈλμμ μμ μν κ²°κ³Όλ₯Ό μ°Έμ‘°ν μ μλ€.
Durablility(μμμ±,μ§μμ±) - νΈλμμ μ μν΄ μ²λ¦¬λ λ°μ΄ν°λ μꡬμ μΌλ‘ μ μ₯λλ€.
- μ±κ³΅μ μΌλ‘ μλ£λ νΈλμμ μ κ²°κ³Όλ μμ€ν μ΄ κ³ μ₯λλλΌλ μꡬμ μΌλ‘ λ°μλμ΄μΌ νλ€.
#2. JDBC νΈλμμ
DBμμμ μ²λ¦¬λλ λͺ¨λ λμμ νΈλμμ λ¨μλ‘ μ€νλλ€. μ°λ¦¬κ° JDBC μ½λλ‘ νΈλμμ μ λ§λ€μ§ μμλλΌλ DB λ΄λΆμ μΌλ‘λ μμ νΈλμμ μ λ§λ€μ΄ ν΄λΉ μμ²μ μ²λ¦¬νλ€. λ§μ½ Java μ½λλ‘ μ§μ νΈλμμ μ λ§λ€κ³ μΆλ€λ©΄Connection κ°μ²΄μ λ©μλλ₯Ό μ΄μ©νμ¬ μ΄μ©νμ¬ λ§λ€ μ μλ€.
import java.sql.*;
// import java.sql.Connection;
/* ... μ€κ°μ½λ μλ΅ ... */
// (1)
Connection connection=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl",
"user","password");
try(connection){
connection.setAutoCommit(false); // (2)
//execute some SQL statements...
connection.commit(); // (3)
}catch(SQLException e){
connection.rollback(); // (4)
}
0. JDBC APIλ₯Ό import ν ν λλΌμ΄λ² κ°μ²΄λ₯Ό μμ±νλ€. (Java1.6 μ΄ν μλ΅κ°λ₯)
* Java 1.6, JDBC 4.0 μ΄νμ JDBCμμλ μλΉμ€ λ‘λ(java.util.ServiceLoader) κΈ°λ°μΌλ‘ JDBC Driverκ° μλμΌλ‘ λ±λ‘λ©λλ€. μ¦ Class.forName("com.mysql.jdbc.Driver") λ₯μ μ½λλ₯Ό μλμΌλ‘ νΈμΆνμ§ μμλ λ±λ‘λ©λλ€.
- JDBC 컀λ₯μ μ μμ±νλ€.
- μλ°μμ νΈλμμ μ μμνλ μ μΌν λ°©λ²μ΄λ€. κΈ°λ³Έ κ°μΈ connection.setAutoCommit(true) μ΅μ μ λͺ¨λ SQL Statementλ₯Ό λννμ¬ μ»€λ°, λ‘€λ°±λ±μ νΈλμμ μ΄ JDBC API λ΄λΆμμ μλμΌλ‘ μ²λ¦¬λκ²λλ€. ν΄λΉ μ΅μ μ falseλ‘ λ°κΎΈμ΄μΌ λ΄κ° μ§μ νΈλμμ μ κ΄λ¦¬ ν μ μλ€.
- ν νΈλμμ μΌλ‘ λ¬Άμ SQLμ μ€ν ν λ€ .commit() λλ .rollback() νλ€. μ΄λ DB νΈλμμ μ 컀λ°, λ‘€λ°±κ³Ό λμΌνλ€.
(μ€νλ§ & DB κ³΅λΆ μ΄ν μΆκ° μμ± μμ )