yeony._.
πŸ’μ½©λΆ€πŸ’
yeony._.
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (99)
    • πŸ’»Programming (91)
      • β˜•οΈJava (19)
      • πŸ’½Oracle (21)
      • πŸ‘©‍🎨HTML&CSS (12)
      • 🎨 μ‹€μŠ΅ (4)
      • πŸƒ‍♀️JavaScript (25)
      • JSP (8)
      • πŸƒSpring (0)
      • πŸ₯§python (0)
      • API (0)
      • 😈Git (1)
    • 🀫Private (0)
      • -- (0)
      • + (0)
      • S (0)
      • P (0)
      • B (0)
    • 😎Project (4)
      • πŸ—“οΈwbs ν”„λ‘œμ νŠΈ (3)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ
  • λ°©λͺ…둝

곡지사항

인기 κΈ€

νƒœκ·Έ

  • HTML #CSS #HTML이미지 #HTML이미지에글씨 #HTML이미지에이미지

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
yeony._.

πŸ’μ½©λΆ€πŸ’

πŸ’»Programming/β˜•οΈJava

Transaction(νŠΈλžœμž­μ…˜)

2022. 8. 24. 21:24

νŠΈλžœμž­μ…˜ 

λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™˜μ‹œν‚€λŠ” ν•˜λ‚˜μ˜ 논리적 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μž‘μ—… λ‹¨μœ„ λ˜λŠ” ν•œ λ²ˆμ— λͺ¨λ‘ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  일련의 μ—°μ‚° 

λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ—μ„œ 병행 μ œμ–΄ 및 회볡 μž‘μ—… μ‹œ μ²˜λ¦¬λ˜λŠ” 논리적 λ‹¨μœ„

μ‚¬μš©μžκ°€ μ‹œμŠ€ν…œμ— λŒ€ν•œ μ„œλΉ„μŠ€ μš”κ΅¬ μ‹œ μ‹œμŠ€ν…œμ΄ μ‘λ‹΅ν•˜κΈ° μœ„ν•œ μƒνƒœ λ³€ν™˜ κ³Όμ •μ˜ μž‘μ—… λ‹¨μœ„ 

 

νŠΈλžœμž­μ…˜μ˜ νŠΉμ§•(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
    'πŸ’»Programming/β˜•οΈJava' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • CallableStatement ν™œμš©(1) - 였라클 ν”„λ‘œμ‹œμ €
    • CallableStatement
    • PreparedStatement ν™œμš©
    • PreparedStatement
    yeony._.
    yeony._.
    힘 μ„Έμ§€λŠ” μ•Œμ•½πŸ’ŠπŸ’ŠπŸ’Š

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”