>  기사  >  데이터 베이스  >  MySQL의 낙관적 잠금 및 비관적 잠금 소개(코드 예)

MySQL의 낙관적 잠금 및 비관적 잠금 소개(코드 예)

不言
不言앞으로
2019-02-01 10:13:553706검색

이 기사에서는 MySQL의 낙관적 잠금과 비관적 잠금에 대해 소개합니다(코드 예제). 도움이 필요한 친구가 참조할 수 있습니다. .

  • 데이터베이스 관리 시스템에서 동시성 제어 작업은 여러 트랜잭션이 데이터베이스의 격리와 통일성을 파괴하지 않고 동시에 데이터베이스의 동일한 데이터에 액세스하도록 보장하는 것입니다. 트랜잭션과 데이터베이스의 통일성

  • 낙관적 잠금 및 비관적 잠금 동시성 제어에 사용되는 주요 기술적 수단

  • #🎜🎜 #
비관적 잠금#🎜 🎜#

    관계형 데이터베이스 관리 시스템에서 비관적 동시성 제어(비관적 잠금, PCC)는 동시성 제어 방법입니다. 이는 트랜잭션이 다른 사용자에게 영향을 미치는 방식으로 데이터를 수정하는 것을 방지합니다. 트랜잭션이 수행하는 작업에 대해 데이터의 각 행에 잠금을 적용하면 트랜잭션 잠금이 해제되어야만 다른 트랜잭션에서 잠금과 충돌하는 작업을 수행할 수 있습니다
  • #🎜 🎜## 🎜🎜#
비관적 동시성 제어는 주로 데이터 경합이 심한 환경에서 사용되며, 동시성 충돌이 발생할 경우 데이터 보호를 위해 잠금을 사용하는 비용이 트랜잭션을 롤백하는 비용보다 저렴합니다.
#🎜 🎜#
  • 비관적 잠금은 외부 세계에 의해 수정되는 데이터(본 시스템의 다른 현재 트랜잭션 및 외부 시스템에서 처리되는 트랜잭션 포함)에 대해 보수적인 태도(비관적)를 의미합니다. ), 따라서 여름 방학 내내 데이터를 처리하는 동안 데이터가 잠깁니다. 비관적 잠금의 구현은 일반적으로 데이터베이스에서 제공하는 잠금 메커니즘에 의존합니다(권장 튜토리얼:

    MySQLTutorial

    )

The process of pessimistic locking 데이터베이스에 다음과 같이

  • 레코드를 수정하기 전에 레코드에 독점 잠금을 추가해 보세요

  • #🎜🎜 #
      잠금이 실패하면 레코드가 수정되고 있다는 의미이므로 현재 쿼리는 기다리거나 예외가 발생해야 할 수 있습니다.
    • 잠금이 걸린 경우 기록을 수정하면 거래가 완료된 후 잠금이 해제됩니다
    • 기록을 수정하거나 독점을 추가하는 다른 작업이 있는 경우 잠금을 해제하면 우리가 잠금을 해제하거나 직접 던질 때까지 기다립니다. 예외
    • MySQL InnoDB에서 비관적 잠금 사용

      # 🎜🎜#비관적 잠금을 사용하려면 mysql 데이터베이스를 닫아야 합니다. MySQL은 기본적으로 자동 커밋 모드를 사용하므로 자동으로 속성을 제출합니다. 즉, 업데이트 작업을 수행하면 MySQL이 즉시 결과를 제출합니다
    //开始事务
    begin;/begin work;/start transaction;(三者选一个)
    select status from t_goods where id=1 for update;
    //根据商品信息生成订单
    insert into t_orders (id,goods_id) values (null,1);
    //修改商品status为2
    update t_goods set status=2;
    // 提交事务
    commit;/commit work;
위 쿼리문에서는 select가 사용되었습니다. ..for update 메소드는 배타적 잠금을 켜서 비관적 잠금을 구현합니다. 해당 레코드는 잠겨 있으며 다른 트랜잭션은 실행되기 전에 이 트랜잭션이 제출될 때까지 기다려야 합니다.
데이터를 잠그기 위해 업데이트에 select...를 사용하지만 잠금 수준, MySQL InnoDB 기본 행 수준 잠금에 주의하세요. 행 수준 잠금은 인덱스를 기반으로 합니다. SQL 문이 인덱스를 사용하지 않는 경우 테이블 수준 잠금은 전체 테이블을 잠그는 데 사용되지 않습니다.

기능

데이터 처리 보안 보장

# 🎜🎜#효율성 측면에서 잠금 메커니즘은 데이터베이스에 추가 오버헤드를 발생시키고 교착 상태 가능성을 높입니다
  • 읽기 전용에서는 발생하지 않으므로 트랜잭션 충돌이 발생하면 잠금을 사용할 필요가 없으므로 시스템 부하가 증가하고 병렬성이 감소합니다. #

    낙관적 동시성 제어도 동시성 제어의 한 방법입니다.
  • 다중 사용자 동시 트랜잭션이 처리 중에 서로 영향을 미치지 않는다고 가정하면 각 트랜잭션은 잠금을 생성하지 않고 영향을 받는 데이터 부분을 처리할 수 있습니다. 데이터가 업데이트되면 각 트랜잭션은 먼저 트랜잭션이 데이터를 읽은 후 다른 트랜잭션이 데이터를 수정했는지 확인합니다. 그렇다면 제출한 트랜잭션이 롤백됩니다. 🎜# 비관적 잠금과 비교하여 낙관적 잠금은 데이터가 충돌하지 않는다고 가정합니다. 따라서 업데이트를 위해 데이터가 제출되면 충돌이 발견되면 사용자 오류 메시지를 반환합니다. 그리고 사용자가 무엇을 할지 결정하게 하세요
  • Optimistic 잠금 구현은 일반적으로 레코드 버전 번호를 사용하여 데이터에 버전 식별을 추가하고, 데이터를 업데이트할 때 버전 ID 업데이트

Implementation
    버전 번호 사용 시 데이터 초기화 시 버전 번호를 지정할 수 있으며, 데이터의 각 업데이트 작업 버전 번호에 대해 +1 작업을 수행합니다. 그리고 현재 버전 번호가 데이터의 최신 버전 번호인지 확인합니다
  • 1.查询出商品信息
    select (status,status,version) from t_goods where id=#{id}
    2.根据商品信息生成订单
    3.修改商品status为2
    update t_goods 
    set status=2,version=version+1
    where id=#{id} and version=#{version};

    Features

  • 낙관적 동시성 제어는 트랜잭션 간의 데이터 경쟁 확률이 작다고 믿습니다. 최대한 제출 전까지만 잠그시면 잠금이나 교착상태가 발생하지 않습니다

위 내용은 MySQL의 낙관적 잠금 및 비관적 잠금 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제