>  기사  >  데이터 베이스  >  oracle에서 업데이트에 대한 사용법은 무엇입니까?

oracle에서 업데이트에 대한 사용법은 무엇입니까?

WBOY
WBOY원래의
2022-03-02 12:05:3714829검색

Oracle에서 "for update"는 행에 행 수준 잠금을 적용하는 데 사용되는 행 수준 잠금입니다. 잠긴 사용자는 데이터 행을 쿼리하고 업데이트할 수 있지만 다른 사용자는 잠긴 행을 쿼리하고 업데이트할 수 없습니다. row.row의 경우 구문은 "SELECT * FROM 테이블 이름 WHERE 열 이름 FOR UPDATE;"입니다.

oracle에서 업데이트에 대한 사용법은 무엇입니까?

이 튜토리얼의 운영 환경: Windows 10 시스템, Oracle 11g 버전, Dell G3 컴퓨터.

Oracle에서 for update의 사용법은 무엇입니까

1. for update

for update의 정의는 행 수준 잠금으로, 사용자가 행에 행 수준 잠금을 적용하면 배타적 잠금이라고도 합니다. , 그러면 이 사용자는 잠긴 데이터 행을 쿼리하고 업데이트할 수 있는 반면, 다른 사용자는 쿼리만 할 수 있지만 잠긴 데이터 행을 업데이트할 수는 없습니다. 다른 사용자가 테이블의 데이터 행을 업데이트하려는 경우 테이블에 행 수준 잠금도 적용해야 합니다. 여러 사용자가 테이블에 공유 업데이트를 사용하더라도 두 트랜잭션이 동시에 테이블을 업데이트하는 것은 허용되지 않습니다. 테이블이 실제로 업데이트되면 트랜잭션이 커밋되거나 복원될 때까지 테이블이 배타적으로 잠깁니다. 행 잠금은 항상 배타적 잠금입니다.

공유 업데이트 잠금은 다음 조건 중 하나가 발생할 때만 해제됩니다.

1. 커밋(COMMIT) 문 실행

2. 데이터베이스 종료(LOG OFF)

3.

2. 개념 및 사용법

일반적으로 select 문은 데이터를 잠그지 않으며 다른 DML 및 DDL 작업이 영향을 받는 것을 방지합니다. 동시에 다중 버전 일관성 읽기 메커니즘을 지원하므로 select 문은 다른 유형의 문에 의해 차단되지 않습니다.

select … for update 문은 우리가 자주 사용하는 수동 잠금 문입니다. 데이터베이스에서 업데이트를 위해 select ...를 실행하면 데이터베이스의 테이블이나 특정 행 데이터가 잠기는 것을 확인할 수 있습니다. mysql에서는 쿼리 조건에 기본 키가 포함되어 있으면 행 데이터가 잠깁니다. 그렇지 않으면 테이블이 잠길 것입니다.

InnoDB는 기본적으로 행 수준 잠금을 사용하므로 MySQL은 기본 키가 "명확하게" 지정된 경우에만 행 잠금(선택한 데이터만 잠그기)을 실행합니다. 그렇지 않으면 MySQL은 테이블 잠금(전체 데이터 형식 잠금)을 실행합니다. .

예: id와 name이라는 두 개의 열이 있는 테이블 사용자가 있고 id가 기본 키라고 가정합니다.

예제 1: (기본 키를 명시적으로 지정하고 데이터가 존재하면 행 잠금)

SELECT * FROM user WHERE id=3 FOR UPDATE;
SELECT * FROM user WHERE id=3 and name='Tom' FOR UPDATE;

예 2: (기본 키를 명시적으로 지정하지만 데이터가 존재하지 않으며 잠금이 없음)

SELECT * FROM user WHERE id=0 FOR UPDATE;

예 3: (기본 키가 명확하지 않음, 테이블 잠금)

SELECT * FROM user WHERE id<>3 FOR UPDATE;
SELECT * FROM user WHERE id LIKE &#39;%3%&#39; FOR UPDATE;

예 4: (기본 키 없음, 테이블 잠금)

SELECT * FROM user WHERE name=&#39;Tom&#39; FOR UPDATE;

참고:

1 FOR UPDATE는 InnoDB에만 적용 가능하며 트랜잭션 처리 모듈에 있어야 합니다( BEGIN/COMMIT)이 적용됩니다.

2. 잠금 상황을 테스트하려면 MySQL의 명령 모드를 사용하여 두 개의 창을 열어 테스트할 수 있습니다.

3. Myisam은 테이블 수준 잠금만 지원하는 반면 InnerDB는 행 수준 잠금을 지원합니다. 추가된(행 수준 잠금/테이블 수준 잠금) 잠금이 있는 데이터는 다른 트랜잭션에 의해 잠기거나 수정할 수 없습니다. 테이블 수준 잠금인 경우 레코드 쿼리 여부에 관계없이 테이블이 잠깁니다.

3. 업데이트는 언제 사용해야 하나요?

for update 문을 사용하면 애플리케이션 수준에서 데이터 잠금 및 보호 작업을 수동으로 구현할 수 있습니다. 독점적인 비즈니스 수준의 데이터가 필요한 경우 업데이트를 위해 사용하는 것을 고려할 수 있습니다.

기차표 예약과 같은 시나리오에서는 화면에 표가 표시되지만, 실제로 표가 발행되는 경우에는 다른 클라이언트에 의해 데이터가 수정되지 않았는지 다시 확인해야 합니다. 따라서 이 확인 과정에서 업데이트를 이용하실 수 있습니다.

4. 업데이트 비관적 잠금

비관적 잠금: 항상 최악의 시나리오를 가정하고 데이터를 얻을 때마다 다른 사람이 수정할 것이라고 생각하므로 데이터를 얻을 때마다 잠그도록 합니다. 기타 이 데이터를 얻으려면 잠금이 해제될 때까지 차단됩니다. 이러한 많은 잠금 메커니즘은 행 잠금, 테이블 잠금, 읽기 잠금, 쓰기 잠금 등과 같은 기존 관계형 데이터베이스에서 사용되며 작업 전에 모두 잠깁니다. 업데이트와 마찬가지로 Java의 동기화 키워드 구현도 비관적 잠금입니다.

낙관적 잠금: 이름에서 알 수 있듯이 매우 낙관적입니다. 데이터를 얻으러 갈 때마다 다른 사람이 수정하지 않을 것이라고 생각하므로 잠그지 않습니다. 그러나 업데이트할 때 다른 사람이 있는지 판단하게 됩니다. 이 기간 동안 데이터를 업데이트했습니다. 버전 번호와 같은 메커니즘을 사용할 수 있습니다. 낙관적 잠금은 처리량을 향상시킬 수 있는 다중 읽기 애플리케이션 유형에 적합합니다. 데이터베이스에서 제공하는 write_condition 메커니즘은 실제로 낙관적 잠금입니다.

추천 튜토리얼: "

Oracle Video Tutorial

"

위 내용은 oracle에서 업데이트에 대한 사용법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.