비관적 잠금은 외부 세계에 의해 수정되는 데이터에 대한 보수적인 태도를 의미합니다. 즉, 데이터 처리 중에 데이터를 잠금 상태로 유지하는 것입니다. 이 기능은 데이터베이스가 제공하는 잠금 메커니즘에 의존해야 합니다. 잠금 메커니즘은 시스템에 구현되어 있으며, 데이터가 외부 시스템에 의해 수정되지 않을 것이라는 보장도 없습니다.
Lock 모드
LockMode.NONE
LockMode.NONE
无锁机制
LockMode.READ
Hibernate在读取记录时自动获取锁
即共享锁:(Shared lock, S 锁),共享锁又称读锁。如果事务 T 获得了数据对象 A 上的共享锁(也就是说对 A 加上共享锁),那么其他事务只能获得 A 上的 共享锁(S 锁),而不能加排他锁(X 锁),直到 A 释放所有的共享锁。获准共享锁的事务只能读数据,不能修改数据。
LockMode.WRITE
Hibernate在insert获者update记录时自动获取锁
即排他锁:(Exclusive lock, X 锁),排他锁又称写锁。如果事务 T 获得了数据 A 上的排他锁,那么 T 既可以读又可以写 A,但是在 T 释放 A 上的 X 锁之前,其他事务既不能获得 A 上的共享锁,也不能获得 A 上的排他锁。
LockMode.UPGRADE
如果数据库系统支持悲观锁(如Oracle和MySQL),就执行select…for update语句(行级锁住,其他事务不能对其进行update、insert和delete语句),如果数据库不支持悲观锁(如Sybase),就执行普通的select语句。
LockMode.UPGRADE_NOWAIT
LockMode.READ
Hibernate는 레코드를 읽을 때 자동으로 이를 얻습니다.
는 공유 잠금입니다: (공유 잠금, S 잠금) 공유 잠금은 읽기 잠금이라고도 합니다. 트랜잭션 T가 데이터 개체 A에 대한 공유 잠금을 획득하면(즉, A에 공유 잠금 추가) 다른 트랜잭션은 A에 대한 공유 잠금(S 잠금)만 획득할 수 있지만 배타적 잠금(X 잠금)은 추가할 수 없습니다. A가 모든 공유 잠금을 해제할 때까지. 공유 잠금이 부여된 트랜잭션은 데이터를 읽을 수만 있고 데이터를 수정할 수는 없습니다.Hibernate는 업데이트 레코드 삽입시 자동으로 잠금을 획득합니다즉, 배타적 잠금: (배타적 잠금, X 잠금), 배타적 잠금은 쓰기 잠금이라고도 합니다. 트랜잭션 T가 데이터 A에 대한 배타적 잠금을 획득하면 T는 A를 읽고 쓸 수 있지만 T가 A에 대한 X 잠금을 해제할 때까지 다른 트랜잭션은 A에 대한 공유 잠금이나 A에 대한 X 잠금을 획득할 수 없습니다. 배타적 잠금.
LockMode.WRITE
LockMode.UPGRADE
데이터베이스 시스템이 비관적 잠금(예: Oracle 및 MySQL)을 지원하는 경우 select...for 업데이트 문을 실행합니다(행 수준 잠금, 다른 트랜잭션은 업데이트할 수 없음, 삽입 및 delete 문), 데이터베이스가 비관적 잠금(예: Sybase)을 지원하지 않는 경우 일반 select 문이 실행됩니다.
LockMode.UPGRADE_NOWAIT
와 LockMode.UPGRADE는 동일한 기능을 갖습니다. 또한 Oracle 데이터베이스에 대해 select...for update nowait 문을 실행합니다. "nowait"는 select 문을 실행하는 트랜잭션이 비관적 잠금을 즉시 얻을 수 없는 경우 다른 트랜잭션이 잠금을 해제할 때까지 기다리지 않고 즉시 잠금 예외를 발생시키는 것을 의미합니다.
잠금 데모
참고: 잠금은 트랜잭션에서 작동하는 데이터 개체에만 작동하며 전체 데이터베이스에서는 작동하지 않으며 전체 데이터베이스를 잠급니다.
"업데이트용"은 비관적 잠금을 추가하는 것을 의미합니다. 이 쿼리 후에는 트랜잭션이 제출되지 않습니다. 이는 잠금이 아직 해제되지 않았음을 의미합니다🎜🎜트랜잭션 T2에서 데이터베이스에 있는 학생 번호 "2016"으로 학생 정보를 쿼리하고 운영되는 데이터에 비관적 잠금을 추가합니다. * 업데이트를 위한 stu_no="2016"인 stu_info에서;. 이때 해당 정보를 쿼리할 수도 있습니다. 🎜🎜트랜잭션이 아직 제출되지 않았습니다.🎜🎜트랜잭션 T2에서 데이터베이스에 있는 학생 번호 "2015"로 학생 정보를 쿼리합니다. 이번에는 잠금 없이 일반 선택 쿼리를 수행합니다. select * from stu_info where stu_no="2015 ";. 이때 해당 정보를 쿼리할 수도 있습니다. 🎜🎜트랜잭션이 아직 커밋되지 않았습니다🎜🎜트랜잭션 T2에서 데이터베이스에 있는 중학교 번호 "2015"의 학생 정보를 쿼리하고 운영되는 데이터에 비관적 잠금을 추가해 봅니다. 선택 * from stu_info where stu_no=" 2015" 업데이트용;. 이때 관련 정보가 표시되지 않고 대기 중인 것을 확인할 수 있습니다. 트랜잭션 T1을 제출(예: 커밋)하면 데이터 개체 "2015"가 T1의 비관적 잠금을 해제하므로 트랜잭션 T2가 관련 정보를 쿼리하고 비관적 잠금을 얻을 수 있습니다. 🎜🎜5단계를 바꾸면. 방금 다섯 번째 단계에서는 트랜잭션 T1에서 학생 번호의 학생 정보를 "2016"으로 수정했지만 이전에 트랜잭션 T2의 기록에 비관적 잠금을 추가했지만 아직 비관적 잠금을 추가하지 않았기 때문에 비관적 잠금을 추가하지 않았습니다. 릴리스되었으므로 T2가 제출된 후에만 수정이 성공할 수 있습니다. 🎜🎜🎜추천 튜토리얼: "🎜MySQL 튜토리얼🎜"🎜🎜두 개의 트랜잭션 T1과 T2를 나타낼 수 있는 두 개의 SQL 명령줄 인터페이스를 엽니다. 먼저 두 인터페이스에서 명령을 실행합니다. 트랜잭션 시작;트랜잭션 T1에서 데이터베이스에 있는 학생 번호 "2015"로 학생 정보를 쿼리하고 운영되는 데이터에 비관적 잠금을 추가합니다. 선택 * from stu_info, 여기서 stu_no= 업데이트용 "2015";. 이때 해당 정보를 조회할 수 있습니다.
위 내용은 비관적 잠금이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!