집 >데이터 베이스 >MySQL 튜토리얼 >mysql 잠금 메커니즘에 대한 자세한 설명
이 기간 동안 mysqldatabase를 배웠습니다. 프로젝트팀에서는 oracle을 사용해왔기 때문에 mysql에 대한 이해가 깊지 않습니다. 이 글은 주로 mysql 잠금에 대한 요약입니다.
Mysql 잠금은 주로 으로 나뉩니다. 3주요 카테고리:
테이블 수준 잠금: 스토리지 엔진은 Myisam #🎜 🎜#. 전체 테이블 잠금은 낮은 오버헤드, 빠른 잠금, 강력한 잠금, 가장 높은 잠금 충돌 가능성 및 가장 낮은 동시성을 특징으로 합니다.
페이지 수준 잠금: 스토리지 엔진은 BDB입니다. 특정 페이지(16kb 등)의 데이터를 잠급니다. 기능: 오버헤드 및 잠금 시간은 테이블 수준과 행 수준 사이에 있으며 교착 상태가 발생하고 잠금이 발생합니다. 테이블 잠금과 행 잠금 사이에 있으며 동시성은 평균입니다.
행 수준 잠금: 스토리지 엔진은 innodb입니다. 특정 데이터 행 잠금 기능: 잠금 구현이 더 복잡하고 비용이 많이 들고 잠금 속도가 느립니다.
위의 특성을 기반으로 잠금의 관점에서만 볼 때: 테이블 수준 잠금은 주로 쿼리를 기반으로 하고 소량만 포함하는 애플리케이션에 더 적합합니다. Web 애플리케이션과 같이 인덱스 조건에 따라 업데이트되는 데이터의 경우 행 수준 잠금은 인덱스 조건에 따라 소량의 서로 다른 데이터를 동시에 업데이트하는 애플리케이션에 더 적합합니다. 일부 온라인 거래 처리(#🎜 🎜#OLTP) 시스템과 같은 동시 쿼리도 포함됩니다.
다음으로 행 수준 잠금에 대해 자세히 설명하겠습니다.7 : 공유 #🎜 🎜#/전용 잠금, 의도 잠금, 레코드 잠금, 간격 잠금, 임시 구성 잠금, 삽입 의도 잠금, 자동 증가 잠금. Shared
/독점 잠금: 공유 잠금: 읽기 잠금이라고도 함, 읽기는 허용되지만 쓰기는 허용되지 않습니다. 공유 잠금은 공유 잠금과 함께 사용할 수 있습니다. 설명:
select ... lock in share mode독점 잠금: 쓰기 잠금이라고도 하며, 읽기나 쓰기가 허용되지 않습니다. 독점 잠금은 다른 잠금과 함께 사용할 수 없습니다. 성명서:
select ... for updateIn mysql
, update#🎜 🎜 #, 삭제, insert, alter#🎜 🎜 #이러한 쓰기 작업은 기본적으로 배타적 잠금을 추가합니다. Select기본적으로 잠금 유형이 추가되지 않습니다. 데이터 쓰기 작업이 완료되지 않으면 다른 작업에서 데이터를 읽을 수 없으므로 동시 작업에 더 큰 영향을 미칩니다. 의도 잠금: innoDB다중 세분성 잠금을 지원하기 위해, 즉 행 수준 잠금과 테이블 수준 잠금을 허용합니다. 잠금이 공존하기 위해 의도 잠금이 도입되었습니다. 의도 잠금은 미래의 어느 시점에 트랜잭션이 공유
/독점 잠금을 추가해야 할 수도 있음을 의미합니다. 먼저 의도를 미리 선언하세요. 이렇게 하면 누군가 테이블 전체를 수정하려고 하면 테이블의 데이터가 잠겨 있는지 여부를 확인할 필요가 없으며 의도된 뮤텍스 잠금이 해제될 때까지 기다리기만 하면 됩니다. Intention 공유 잠금(IS
): 트랜잭션이 테이블의 특정 레코드를 얻으려고 합니다. 공유 잠금의 경우 먼저 테이블에 의도적인 공유 잠금을 추가해야 합니다. Intention mutex lock (IX
): 트랜잭션은 테이블의 특정 레코드를 얻으려고 합니다. 뮤텍스 잠금의 경우 먼저 테이블에 의도 뮤텍스 잠금을 추가해야 합니다.
意向锁其实不会阻塞全表扫描之外的任何请求,它们的主要目的是为了表示是否有人请求锁定表中的某一行数据。
记录锁(RS):单个行记录上的锁。记录锁总是会锁住索引记录,如果innoDB存储引擎表
在建立的时候没有设置任何一个索引,那么innoDB存储引擎会使用隐式的主键来进行锁定。
间隙锁(GR):间隙锁锁住记录中的间隔,即范围查询的记录。
Select * From user where id between 1 and 10 for update
这个脚本会锁住1到10 的数据,以防止其他事务修改该区间的记录;
间隙锁的主要目的,就是为了防止其他事务在间隔中插入数据,以导致“不可重复读”。如果把事务的隔离级别降级为读提交(Read Committed, RC),间隙锁则会自动失效
临建锁(next-key Locks):临建锁是记录锁和间隙锁的组合,锁的范围既包含记录又包含索引区间。默认情况下,innoDB使用临建锁来锁定记录。但当查询的索引含有唯一属性的时候,临建锁会进行优化,将其降级为记录锁,即仅锁住索引本身,不是范围。
临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。
插入意向锁(insert intention locks):对已有数据行的修改和删除,必须加互斥锁,对于数据的插入,加插入意向锁。是专门针对于insert操作的。
自增锁(auto-inc locks):是一种特殊的表级别的锁,专门针对事务插入auto-increment类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。
---------------------------------------------------------分界线--------------------------------------------------------------
接下看讲一下其他的锁:
死锁:产生是因为线程锁之间交替等待产生的。值两个或两个以上的事务在执行过程中,因争夺资源而造成的一种相互等待的现象。
Mysql处理死锁的方法:根据数据写的数据量的大小来回滚小事务。
乐观/悲观锁:
乐观锁:乐观的假定大概率不会发生并发更新冲突,访问,处理数据的过程中不加锁,只在更新数据时根据版本号或时间戳判断是否有冲突,有则处理,无责提交事务。
如果系统并发量非常大,悲观锁会带来非常大的性能问题,选择使用乐观锁,现在大部分应用属于乐观锁
悲观锁:悲观的假定大概率会发生并发更新冲突,访问,处理数据前就加排他锁,在整个数据处理过程中锁定数据,事务提交或回滚后才释放锁。
优点:
悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。
缺点:
(a)在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;
(b) 읽기 전용 트랜잭션 처리에는 충돌이 없으므로 잠금을 사용할 필요가 없습니다. 이는 시스템 부하만 증가시킵니다. 병렬성을 줄이세요. 트랜잭션이 특정 데이터 행을 잠그면 다른 트랜잭션은 해당 행 수를 처리하기 전에 트랜잭션이 처리될 때까지 기다려야 합니다
제안:
#🎜 🎜## 🎜🎜#트랜잭션 크기 제어(작업으로 기록되는 데이터의 양)위 내용은 mysql 잠금 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!