> Java > java지도 시간 > 본문

Java 트랜잭션을 위한 Spring 트랜잭션(JDBC)

巴扎黑
풀어 주다: 2017-06-26 11:26:18
원래의
1419명이 탐색했습니다.

트랜잭션의 특징:

1) 원자성: 트랜잭션은 데이터베이스의 논리적 작업 단위이며, 데이터 수정을 위해서는 모두 실행되거나 전혀 실행되지 않는 원자적 작업 단위여야 합니다. .

2) 일관성: 거래가 완료되면 모든 데이터가 일관성을 유지해야 합니다. 관련 데이터베이스에서는 모든 데이터의 무결성을 유지하기 위해 트랜잭션 수정에 모든 규칙을 적용해야 합니다.

3) 격리: 트랜잭션 실행은 다른 트랜잭션의 영향을 받을 수 없습니다.

4) 내구성: 트랜잭션이 제출되면 해당 트랜잭션의 작업이 DB에 영구적으로 저장됩니다. 이때 롤백 작업을 수행하더라도 변경 사항은 취소되지 않습니다.

트랜잭션: 동시성 제어 단위이자 사용자가 정의한 작업 순서입니다. 이러한 작업은 모두 완료되거나 아무것도 수행되지 않으며 이는 통합 작업 단위입니다. 트랜잭션을 통해 SQL Server는 논리적으로 관련된 일련의 작업을 함께 바인딩하여 서버가 데이터 무결성을 유지할 수 있습니다. 트랜잭션은 일반적으로 트랜잭션 시작으로 시작하여 커밋 또는 롤백으로 끝납니다. 커밋은 제출, 즉 트랜잭션을 커밋하는 모든 작업을 의미합니다. 특히 트랜잭션의 데이터에 대한 모든 업데이트는 디스크의 물리적 데이터베이스에 다시 기록되고 트랜잭션은 정상적으로 종료됩니다. 롤백은 롤백을 의미합니다. 즉, 트랜잭션이 실행되는 동안 일종의 오류가 발생하여 트랜잭션을 계속할 수 없습니다. 시스템은 트랜잭션의 데이터베이스에 대해 완료된 작업을 모두 취소하고 트랜잭션이 시작된 상태로 롤백합니다.

자동 커밋 트랜잭션: 각 개별 문은 트랜잭션입니다. 각 명령문 뒤에는 암시적 커밋이 있습니다. (기본값)

명시적 트랜잭션: 트랜잭션 표시 시작으로 시작하고 커밋 또는 롤백으로 끝납니다.

암시적 트랜잭션: 연결이 암시적 트랜잭션 모드에서 작동하는 경우 SQL Server 데이터베이스 엔진 인스턴스는 현재 트랜잭션을 커밋하거나 롤백한 후 자동으로 새 트랜잭션을 시작합니다. 사물의 시작을 설명할 필요가 없으며 각 트랜잭션을 커밋하거나 롤백하기만 하면 됩니다. 그러나 각 트랜잭션은 여전히 ​​커밋이나 롤백으로 명시적으로 종료됩니다. 연결이 암시적 트랜잭션 모드를 열기로 설정한 후 데이터베이스 엔진 인스턴스가 테이블 변경, 삽입, 생성, 열기, 삭제, 취소, 삭제, 선택 문 중 하나를 처음으로 실행할 때 암시적 트랜잭션이 자동으로 시작됩니다. , 가져오기, 테이블 자르기, 부여, 업데이트 트랜잭션은 커밋 또는 롤백 문이 실행될 때까지 유효한 상태로 유지됩니다. 첫 번째 트랜잭션이 커밋되거나 롤백된 후 다음에 연결이 위의 문을 실행할 때 데이터베이스 엔진 인스턴스는 자동으로 새 트랜잭션을 시작합니다. 이 인스턴스는 암시적 트랜잭션 모드가 꺼질 때까지 암시적 트랜잭션 체인을 계속 생성합니다.

Java JDBC 트랜잭션 메커니즘

먼저 기존 JDBC 작업이 어떤 주요 문제를 가져올지 살펴보겠습니다. 예를 들어 비즈니스가 있습니다. 정보를 수정한 다음 정보를 쿼리하면 다음과 같습니다. 간단한 비즈니스는 구현하기가 매우 쉽지만, 이 비즈니스를 다중 스레드 높은 동시성 플랫폼에 배치하면 자연스럽게 문제가 발생합니다. 예를 들어 수정을 수행한 후 쿼리를 실행하기 전에 스레드도 실행됩니다. 쿼리를 다시 실행하면 보이는 정보가 수정한 내용과 다를 수 있습니다. 이 문제를 해결하려면 실제로 코드 구현이 매우 간단합니다. 참고 사항:

private Connection conn = null;  
private PreparedStatement ps = null;  
 
try {  
    conn.setAutoCommit(false);  //将自动提交设置为false  
              
    ps.executeUpdate("修改SQL"); //执行修改操作  
    ps.executeQuery("查询SQL");  //执行查询操作                 
    conn.commit();      //当两个操作成功后手动提交  
              
} catch (Exception e) {  
    conn.rollback();    //一旦其中一个操作出错都将回滚,使两个操作都不成功  
    e.printStackTrace();  
}
로그인 후 복사

트랜잭션 관련 이론
1. 트랜잭션의 4가지 속성(ACID)
원자적 데이터 수정은 모두 실행되거나 전혀 실행되지 않습니다.
일관성(Condependent) 트랜잭션 실행 전후에 데이터 상태가 일관되게 유지됩니다.
격리됨 한 거래의 처리는 다른 거래의 처리에 영향을 미칠 수 없습니다.
지속적인 트랜잭션 처리가 종료되고 그 효과가 데이터베이스에 지속됩니다.

2. 동시 트랜잭션 처리로 인해 발생할 수 있는 문제
더티 읽기(Dirty Read): 한 트랜잭션이 아직 다른 트랜잭션에서 제출하지 않은 데이터를 읽는 것,
Non-repeatable read(비반복 읽기): 한 트랜잭션의 작업 전후에 다른 트랜잭션 발생 서로 다른 데이터를 두 번 읽음
팬텀 읽기(phantom read) 한 트랜잭션의 작업으로 인해 다른 트랜잭션 전후의 두 쿼리 결과의 데이터 볼륨이 달라집니다.
예:
트랜잭션 A와 B가 동시에 실행되는 경우
트랜잭션 A가 업데이트된 후 트랜잭션 B는 A의 커밋되지 않은 데이터를 읽기로 선택합니다. 이때 트랜잭션 A는 롤백되고 B가 읽은 데이터는 유효하지 않은 "더티"입니다. 데이터.
B 트랜잭션이 데이터 읽기를 선택한 후 A 트랜잭션 업데이트 작업은 B 트랜잭션이 선택한 데이터를 변경합니다. 이때 B 트랜잭션은 데이터를 다시 읽어 두 데이터가 다르다는 것을 발견합니다.
트랜잭션 B가 데이터 읽기를 선택한 후, 트랜잭션 A는 트랜잭션 A의 선택 조건을 만족하는 레코드를 삽입하거나 삭제합니다. 이때 트랜잭션 B는 다시 선택하여 지난번에 존재하지 않았던 레코드("팬텀")를 발견합니다. 쿼리되었거나 이전 기록이 쿼리되었습니다. 횟수 기록이 누락되었습니다.

JDBC의 트랜잭션 지원
JDBC의 트랜잭션 지원은 세 가지 측면에 반영됩니다.
1. 자동 커밋 모드(Auto-commit mode)
Connection은 트랜잭션이 끝나는 시점을 지정하는 자동 커밋 속성을 제공합니다.
a. 자동 커밋이 true인 경우 각 독립 SQL 작업의 실행이 완료되면 트랜잭션이 자동으로 즉시 제출됩니다. 즉, 각 SQL 작업이 트랜잭션임을 의미합니다.
독립적인 SQL 작업이 완료되면 JDBC 사양에서는 다음과 같이 규정합니다.
데이터 조작 언어(삽입, 업데이트, 삭제 등의 DML) 및 데이터 정의 언어(생성, 삭제 등)의 경우 명령문이 즉시 완료된 것으로 간주됩니다. 실행이 완료됩니다.
select 문의 경우 해당 ResultSet 개체가 닫히면 실행된 것으로 간주됩니다.
여러 결과를 반환하는 저장 프로시저 또는 기타 문의 경우, 이와 관련된 모든 ResultSet 개체가 닫히면 모든 업데이트 개수(업데이트, 삭제 및 기타 문 작업의 영향을 받는 행 수) 및 출력 매개변수(저장 프로시저의 출력 매개변수) )가 획득되면 실행이 완료된 것으로 간주됩니다.
b. 자동 커밋이 false인 경우 각 트랜잭션은 커밋을 위해 명시적으로 커밋 메서드를 호출하거나, 롤백하려면 명시적으로 롤백 메서드를 호출해야 합니다. 자동 커밋의 기본값은 true입니다.
JDBC는 Connection에 정의된 5가지 트랜잭션 격리 수준을 제공합니다.

2. 트랜잭션 격리 수준
JDBC는 5가지 트랜잭션 격리 수준을 정의합니다.
TRANSACTION_NONE JDBC 드라이버는 트랜잭션을 지원하지 않습니다.
TRANSACTION_READ_UNCOMMITTED는 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기를 허용합니다.
TRANSACTION_READ_COMMITTED는 더티 읽기를 금지하지만 반복 불가능한 읽기와 팬텀 읽기는 허용합니다.
TRANSACTION_REPEATABLE_READ는 더티 읽기와 반복 불가능한 읽기를 금지하고 가상 읽기만 실행합니다.
TRANSACTION_SERIALIZABLE은 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기를 금지합니다.

3. SavePoint(SavePoint)
JDBC는 보다 세분화된 트랜잭션 제어 메커니즘을 제공하기 위해 SavePoint 인터페이스를 정의합니다. 저장점이 설정되면 전체 트랜잭션을 롤백하는 대신 저장점 상태로 롤백할 수 있습니다.
Connection 인터페이스의 setSavepoint 및 releaseSavepoint 메소드는 저장점을 설정하고 해제할 수 있습니다.

JDBC 사양은 위의 트랜잭션 지원 동작을 정의하지만 각 JDBC 드라이버 및 데이터베이스 제조업체의 트랜잭션 지원 정도는 다를 수 있습니다. 프로그램에서 임의로 설정하면 원하는 효과를 얻지 못할 수도 있습니다. 이를 위해 JDBC는 JDBC 기능 지원을 얻기 위한 일련의 메소드를 제공하는 DatabaseMetaData 인터페이스를 제공합니다. 예를 들어 트랜잭션 격리 수준에 대한 지원은 DatabaseMetaData.supportsTransactionIsolationLevel 메서드를 통해 결정될 수 있으며, 저장점에 대한 지원은 DatabaseMetaData.supportsSavepoints 메서드를 통해 결정될 수 있습니다.


위 내용은 Java 트랜잭션을 위한 Spring 트랜잭션(JDBC)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!