>  기사  >  데이터 베이스  >  Mysql에서 비관적 잠금과 낙관적 잠금을 적용하는 방법

Mysql에서 비관적 잠금과 낙관적 잠금을 적용하는 방법

PHPz
PHPz앞으로
2023-06-02 21:27:591250검색

1. 자물쇠

생활 속에서 자물쇠는 우리 주변 어디에나 있습니다. 예를 들어, 놀러 나갈 때 문을 잠가야 하고, 금고에 돈을 넣어야 하고, 안전을 위해 꼭 잠가야 합니다. 내 재산의.

코드에서: 예를 들어 여러 스레드가 동시에 공유 변수를 작동하고 수정해야 하는 경우 변수 값이 올바른지 확인하기 위해 변수를 잠그(동기화)해야 합니다.

데이터베이스 테이블: 여러 사용자가 테이블의 동일한 데이터를 수정하는 경우 행 데이터를 잠글 수 있습니다(행 잠금).

sql script

CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `deleted` tinyint(1) DEFAULT NULL COMMENT '是否删除',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `create_id` bigint(20) DEFAULT NULL COMMENT '创建人',
  `update_id` bigint(20) DEFAULT NULL COMMENT '操作人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `status` varchar(255) DEFAULT NULL COMMENT '状态',
  `dog` text DEFAULT NULL COMMENT '狗',
  `version` int(11) DEFAULT NULL COMMENT '版本号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `sys_user`(`id`, `name`, `age`, `email`, `deleted`, `create_time`, `create_id`, `update_id`, `update_time`, `status`, `dog`, `version`) VALUES (1, 'gukong', 19, 'test1@baomidou.com', 0, NULL, NULL, NULL, NULL, NULL, NULL, 0);

2. 비관적 잠금

데이터베이스의 일부 데이터를 수정하려는 경우 다른 사람이 동시에 수정하는 것을 방지하기 위해 가장 좋은 방법은 데이터를 직접 잠그는 것입니다. 동시성이 발생했습니다.

비관적 잠금은 비관적 동시성 제어 방법을 채택하기 때문에 비관적 잠금이라고 하며, 다른 스레드에 의해 데이터가 수정될 것이라고 가정하여 데이터가 수정되면 잠금 작업이 수행됩니다. 우리는 일반적으로 데이터가 동시에 수정될 확률이 상대적으로 높다고 생각하므로 수정 전에 데이터를 잠글 필요가 있습니다.

행 잠금, 테이블 잠금, 읽기 잠금, 쓰기 잠금, 동기화로 구현된 잠금은 모두 비관적 잠금입니다.

mysql은 비관적 잠금을 켭니다(예제 sql 문)

--开启事务
BEGIN
--对行加锁
SELECT * FROM `sys_user` where id = 1 for UPDATE
--修改加锁行的数据
update sys_user set name = 'gukong',age = 18 where id = 1;
--提交事务
commit;
--开启事务
BEGIN
--对行加锁
SELECT * FROM `sys_user` where id = 1 for UPDATE
--修改加锁行的数据
update sys_user set name = 'kulilin',age = 20 where id = 1;
--提交事务
commit;
update sys_user set name = 'kulilin',age = 20 where id = 1;

Mysql에서 비관적 잠금과 낙관적 잠금을 적용하는 방법

3. 낙관적 잠금

Optimistic 잠금은 데이터 충돌에 대해 낙관적인 태도를 유지합니다. , 데이터에 충돌이 있는지 확인하는 메커니즘이 사용됩니다.

낙관적 잠금은 일반적으로 테이블에 버전(version) 또는 타임스탬프(timestamp)를 추가하여 구현되며, 그 중 버전이 가장 일반적으로 사용됩니다.

Optimistic 잠금은 데이터 수정 작업을 수행할 때마다 버전 번호를 가져옵니다. 버전 번호가 데이터 버전 번호와 일치하면 수정 작업이 수행될 수 있으며 그렇지 않으면 실행이 +1됩니다. 실패하다.

Optimistic 잠금 예:

-- version = 0
SELECT * FROM `sys_user` where id = 1 
update sys_user set name='小明',version = version+1 and age = 20 where id = 1 and version = 0;
-- version = 0 ,而此时version=1,更新失败
SELECT * FROM `sys_user` where id = 1 
update sys_user set name = '小红' version = version+1 and age = 25 where id = 1 and version = 0;

Mysql에서 비관적 잠금과 낙관적 잠금을 적용하는 방법

4. 선택 방법

Optimistic 잠금은 자주 잠그고 해제하는 데 따른 오버헤드를 절약하고 처리량을 향상시킬 수 있습니다

. 쓰기 작업 중에 낙관적 잠금을 사용하면 버전이 일관되지 않고 업데이트가 지속적으로 재시도되므로 스핀이 많이 발생하고 CPU를 소비하며 성능에 영향을 미칠 수 있습니다. 이 경우 비관적 잠금이 적합합니다

위 내용은 Mysql에서 비관적 잠금과 낙관적 잠금을 적용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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