이 기사에서는 MySQL의 낙관적 잠금과 비관적 잠금에 대해 소개합니다(코드 예제). 도움이 필요한 친구가 참조할 수 있습니다. .
데이터베이스 관리 시스템에서 동시성 제어 작업은 여러 트랜잭션이 데이터베이스의 격리와 통일성을 파괴하지 않고 동시에 데이터베이스의 동일한 데이터에 액세스하도록 보장하는 것입니다. 트랜잭션과 데이터베이스의 통일성
낙관적 잠금 및 비관적 잠금 동시성 제어에 사용되는 주요 기술적 수단
#🎜 🎜#관계형 데이터베이스 관리 시스템에서 비관적 동시성 제어(비관적 잠금, PCC)는 동시성 제어 방법입니다. 이는 트랜잭션이 다른 사용자에게 영향을 미치는 방식으로 데이터를 수정하는 것을 방지합니다. 트랜잭션이 수행하는 작업에 대해 데이터의 각 행에 잠금을 적용하면 트랜잭션 잠금이 해제되어야만 다른 트랜잭션에서 잠금과 충돌하는 작업을 수행할 수 있습니다
비관적 동시성 제어는 주로 데이터 경합이 심한 환경에서 사용되며, 동시성 충돌이 발생할 경우 데이터 보호를 위해 잠금을 사용하는 비용이 트랜잭션을 롤백하는 비용보다 저렴합니다.- #🎜 🎜## 🎜🎜#
MySQLTutorial
)The process of pessimistic locking 데이터베이스에 다음과 같이
레코드를 수정하기 전에 레코드에 독점 잠금을 추가해 보세요
//开始事务 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 문이 인덱스를 사용하지 않는 경우 테이블 수준 잠금은 전체 테이블을 잠그는 데 사용되지 않습니다.기능
데이터 처리 보안 보장
읽기 전용에서는 발생하지 않으므로 트랜잭션 충돌이 발생하면 잠금을 사용할 필요가 없으므로 시스템 부하가 증가하고 병렬성이 감소합니다. #
낙관적 동시성 제어도 동시성 제어의 한 방법입니다.버전 번호 사용 시 데이터 초기화 시 버전 번호를 지정할 수 있으며, 데이터의 각 업데이트 작업 버전 번호에 대해 +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 중국어 웹사이트의 기타 관련 기사를 참조하세요!