Oracle 교착상태의 원인은 무엇입니까?

WBOY
풀어 주다: 2022-03-03 16:41:42
원래의
8586명이 탐색했습니다.

이유: 1. 트랜잭션 간 리소스 액세스 순서가 바뀌고, 두 사용자가 서로 잠긴 서로의 테이블에 액세스하여 교착 상태가 발생합니다. 2. 두 사용자가 동시에 동일한 레코드를 수정하여 교착 상태가 발생합니다. . 조건을 충족하지 않는 명령문을 실행하거나 부적절한 인덱싱을 수행하면 글로벌 스캔에서 교착 상태가 발생합니다.

Oracle 교착상태의 원인은 무엇입니까?

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

Oracle 교착 상태의 원인은 무엇입니까?

데이터베이스는 여러 사용자가 동시에 사용하는 공유 리소스입니다. 여러 사용자가 동시에 데이터에 액세스하면 여러 트랜잭션이 데이터베이스에서 동시에 동일한 데이터에 액세스하게 됩니다. 동시 작업을 제어하지 않으면 잘못된 데이터를 읽고 저장하여 데이터베이스의 일관성이 손상될 수 있습니다. 잠금은 데이터베이스 동시성 제어를 달성하는 데 매우 중요한 기술입니다. 잠금 관련 예외는 실제 응용 프로그램에서 자주 발생합니다. 두 트랜잭션에 충돌하는 잠금 집합이 필요하고 트랜잭션을 계속할 수 없으면 교착 상태가 발생하여 응용 프로그램의 정상적인 실행에 심각한 영향을 미칩니다.

잠금 유형:

1. 공유 잠금(공유 잠금, S 잠금): 공유 잠금이 있는 데이터 객체는 다른 트랜잭션에서 읽을 수 있지만 수정할 수는 없습니다. 데이터베이스는 이 두 가지 기본 잠금 유형을 사용하여 데이터베이스 트랜잭션의 동시성을 제어합니다.

2. 배타적 잠금(X 잠금): 데이터 개체가 배타적 잠금으로 잠겨 있으면 다른 트랜잭션이 이를 읽거나 수정할 수 없습니다.

3. 단독잠금 : 공유잠금을 기반으로 단독잠금으로 업그레이드 됩니다.

4. 업데이트 잠금: 모든 사용자가 읽을 수 있지만 나중에 업데이트 작업을 할 수도 있습니다. 공유 잠금(읽기용)에서 독점 잠금(업데이트용)까지 자격을 얻었습니다. 이 트랜잭션에는 하나의 업데이트 잠금만 사용할 수 있습니다.

원인:

1. 트랜잭션 간 리소스 액세스 순서 교대: 한 사용자 1이 테이블 A(잠긴 테이블 A)에 액세스한 후 다른 사용자 2가 테이블 B(잠긴 테이블 B)에 액세스했습니다. ) 그런 다음 테이블 A에 액세스하려고 시도합니다. 이때 사용자 1은 사용자 2가 테이블 B를 잠갔기 때문에 계속하려면 사용자 2가 테이블 B를 해제할 때까지 기다려야 합니다. 마찬가지로 사용자 2는 사용자 1이 해제될 때까지 기다려야 합니다. 테이블 A가 계속되기 전에 교착 상태가 발생합니다. 해결 방법: 프로그램 논리 문제. 테이블의 호출 순서에 주의하세요

2. 동일한 레코드를 동시에 수정합니다. 사용자 1이 레코드를 쿼리한 다음 사용자 2가 레코드를 수정하면 사용자 1의 트랜잭션이 잠깁니다. 쿼리의 본질은 공유 잠금이 배타적 잠금으로 상승하려고 시도하고 사용자 2의 배타적 잠금은 1이 공유 잠금을 갖고 있기 때문에 1이 공유 잠금을 해제할 때까지 기다려야 하고 1의 배타적 잠금은 다음으로 인해 상승할 수 없다는 것입니다. 2의 배타적 잠금 해제가 불가능하므로 교착 상태가 발생합니다.

3. 부적절한 인덱싱으로 인해 전체 테이블 스캔이 발생합니다. 트랜잭션이 조건을 충족하지 않는 명령문을 실행하면 전체 테이블 스캔이 실행됩니다. 또는 테이블 데이터의 양이 매우 큽니다. 인덱스가 너무 적거나 전혀 생성되지 않습니다. 적절한 경우

해결책: SQL 문에서 여러 테이블을 연결하고 최적화를 위해 인덱스를 구축하는 너무 복잡한 쿼리를 사용하지 마세요.

참고:

1. oracle 교착 상태 보기 및 교착 상태 해제

select sess.sid,     sess.serial#,     lo.oracle_username,     lo.os_user_name,     ao.object_name,     lo.locked_mode     from v$locked_object lo,     dba_objects ao,     v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid; 
alter system kill session '738,1429';  --释放资源
로그인 후 복사

2.mysql 교착 상태 보기 교착 상태 잠금 및 해제

show processlist         --查看数据库中各个进程的运行状态
select * from information_schema.innodb_trx        ---查询正在运行的事务
kill id
로그인 후 복사

추천 튜토리얼: "Oracle Video Tutorial"

위 내용은 Oracle 교착상태의 원인은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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