MySql의 write 문에서 테이블 열에 할당된 값이 테이블 유형과 일치하지 않으면 MySql의 기본 최적화 프로그램이 작동하여 강제 유형 변환을 수행합니다. 이때 작업은 정상일 수 있지만 행 잠금이 테이블 잠금으로 업그레이드됩니다. 예는 다음과 같습니다
학생 테이블을 예로 들어 보겠습니다. 테이블 필드 유형은 다음과 같습니다.
테이블 내용은 다음과 같습니다.
두 개의 세션 창을 열고 두 세션 창에서 MySql의 자동 제출 모드를 변경합니다. 세션 창에서 수동 제출로
>set autocommit=false;
세션 창 1에서 업데이트 문을 실행하지만 트랜잭션을 커밋하지는 않습니다. age 열은 테이블 생성 시 문자열 '100'이 할당에 사용됩니다. MySql 최적화 프로그램은 자동으로 문자열 '100'을 정수 100으로 변환한 후 SQL 검색을 수행합니다. .
>update student set class=3 where age='100'
그런 다음 세션 창에서 관련 없는 다른 데이터에 대해 업데이트 작업을 수행합니다. 2
>update student set age=28 where name='lzj';
일반적인 상황에서는 두 SQL 문에서 작동하는 행 데이터가 다르므로 실행 시 서로 영향을 미치지 않습니다. 1이 실제로 차단되었습니다. 세션 2의 업데이트 작업이 수행되었습니다.
세션 1에서 업데이트 작업이 수행되었지만 트랜잭션 제출이 수행되지 않았으므로 트랜잭션의 격리 수준이 Read Committed이므로 세션 1의 업데이트 결과를 확인할 수 없습니다. 세션 2에서 볼 수 있습니다. 그러나 Session 2의 다른 행에 대한 데이터 업데이트 작업을 수행하는 동안 차단이 발생했습니다. 세션 1의 SQL 문 할당이 강제되어 세션 1의 행 잠금이 테이블 잠금으로 업그레이드되어 전체 학생 테이블이 잠기므로 세션 2의 SQL이 차단된 것을 볼 수 있습니다. 다음으로 세션 1의 업데이트 작업에 대한 트랜잭션 커밋을 수행한 다음 세션 2의 업데이트 작업이 계속 실행됩니다
세션 1의 업데이트 작업에 대한 commit
을 실행합니다. 트랜잭션을 수동으로 제출한 후 , 세션 1 학생의 테이블 잠금을 해제하고 세션 2의 업데이트 작업을 계속할 수 있습니다. commit
手动提交事务后,会话1释放掉student的表锁,会话2中的更新操作可以继续执行。
最后对会话2中的更新也执行commit
마지막으로 세션 2의 업데이트를 위해 commit
트랜잭션도 실행됩니다. 두 SQL 문 모두 학생 테이블의 내용은 다음과 같습니다.
위의 경우에서 SQL 문 할당 및 테이블 열 유형이 일치하지 않는 경우 MySql 최적화 프로그램은 강제로 일치하는 유형으로 변환되어 행 잠금이 테이블 잠금으로 업그레이드되는 것을 볼 수 있습니다. 따라서 행 잠금이 테이블 잠금으로 업그레이드되어 동시성 성능에 영향을 미치는 것을 방지하려면 개발 중에 유형 일치에 주의해야 합니다.
관련 권장 사항:
MySQL 행 수준 잠금, 테이블 수준 잠금 및 페이지 수준 잠금에 대한 자세한 소개
위 내용은 MySql 유형 변환으로 인해 행 잠금이 테이블 잠금으로 업그레이드됩니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!