source

MySQL - 테이블 'my_table'이 테이블 잠금으로 잠기지 않았습니다.

manysource 2022. 11. 23. 20:19

MySQL - 테이블 'my_table'이 테이블 잠금으로 잠기지 않았습니다.

MySQL을 통해 테이블을 로드하려고 하면 다음 오류가 발생합니까?

MySQL은 다음과 같이 말했습니다.테이블 'cms'가 LOCK TABLES로 잠기지 않았습니다.

테이블을 잠글 필요가 있는 이유는 무엇입니까?나 이거 본 적 없어?잠금을 해제할 방법은 없나요?그러고 싶긴 해?

한 세션에서 한 테이블을 잠그고 다른 테이블에서 선택하려면 해당 테이블도 잠그거나 모든 테이블의 잠금을 해제해야 합니다.

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES

제 해결책은 책상의 잠금을 해제하는 것이었습니다.이전 쿼리에 의해 잠겨 있었습니다.이 쿼리는 에 도달하기 전에 실패했습니다.unlock tables진술.

UNLOCK TABLES
SELECT ...

http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html

MySQL을 사용하면 클라이언트세션은 테이블에 액세스하기 위해 다른 세션과 연계할 목적으로 테이블 잠금을 명시적으로 취득할 수 있습니다.또한 세션에 대한 배타적 액세스가 필요한 기간 동안 다른 세션이 테이블을 변경하지 않도록 할 수 있습니다.세션은 자기 자신에 대해서만 잠금을 취득하거나 해제할 수 있습니다.어떤 세션은 다른 세션의 잠금을 취득할 수 없거나 다른 세션이 보유한 릴리스 잠금을 취득할 수 없습니다.

잠금을 사용하여 트랜잭션을 에뮬레이트하거나 테이블을 업데이트할 때 속도를 높일 수 있습니다.이것에 대해서는, 이 섹션의 후반부에서 자세하게 설명합니다.

LOCK TABLES는 현재 클라이언트세션의 테이블 잠금을 명시적으로 취득합니다.기본 테이블 또는 뷰에 대해 테이블 잠금을 가져올 수 있습니다.잠글 각 개체에 대한 LOCK TABLES 권한과 SELECT 권한이 있어야 합니다.

뷰 잠금을 위해 LOCK TABLES는 뷰에서 사용되는 모든 기본 테이블을 잠글 테이블 세트에 추가하고 자동으로 잠급니다.LOCK TABLES를 사용하여 테이블을 명시적으로 잠글 경우, 섹션 13.3.5.2 "LOCK TABLES 및 트리거"에 설명된 대로 트리거에 사용되는 테이블도 암묵적으로 잠깁니다.

UNLOCK TABLES는 현재 세션에서 보유하고 있는 모든 테이블 잠금을 명시적으로 해제합니다.LOCK TABLES는 새 잠금을 획득하기 전에 현재 세션에서 보유하고 있는 테이블 잠금을 암묵적으로 해제합니다.

UNLOCH TABLES의 또 다른 용도는 FLUSH TABLES WITH READ LOCK 문으로 획득한 글로벌 읽기 잠금을 해제하는 것입니다.이것에 의해, 모든 데이타베이스내의 모든 테이블을 잠글 수 있습니다.섹션 13.7.6.3 "FLUSH 구문"을 참조하십시오.(Veritas와 같이 스냅샷을 제때 생성할 수 있는 파일 시스템이 있는 경우 이 방법은 백업을 수행하는 데 매우 편리합니다.)

LOCK 및 UNLOCK 구문

 LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...

lock_type:
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE

예:-

LOCK TABLE t WRITE, t AS t1 READ;

테이블 잠금 해제

 UNLOCK TABLES

MySQL 문서에서 "Table 'my_table' was not lock with LOCK TABLES" 메시지와 관련된 가장 중요한 행 중 하나는 다음과 같습니다.

"이렇게 얻은 잠금이 유지되는 동안 세션은 잠긴 테이블에만 액세스할 수 있습니다." https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html

즉, LOCK이 설치되어 있는 동안 데이터베이스 내의 다른 테이블에 액세스하려고 하면 "Table 'my_table' was not lock with LOCK TABLES" (테이블 'my_table'은 LOCK TABLES'로 잠기지 않았습니다)라는 오류 메시지가 나타납니다.

이와 같이 잠금 중에 액세스할 수 있는 모든 테이블에 잠금을 적용하는 방법이 있습니다."테이블 잠금_1 쓰기, 테이블_2 쓰기"

여기서 table_1은 잠그지만 동일한 프로세스 중에 table_2에 액세스해야 합니다.

table_1만 잠그고 있었는데 'table_2' 테이블이 LOCK TABLES로 잠겨 있지 않다는 오류 메시지가 표시되었기 때문에 혼란스러웠습니다.

왜 2번 테이블이 연관됐는지 알아내는데 시간이 좀 걸렸어요저는 이것이 같은 문제에 대해 다른 사람에게 도움이 되기를 바랍니다.

내 경우엔 가명이 문제였다.

문서에서:

문장이 에일리어스를 사용하여 테이블을 참조하는 경우 동일한 에일리어스를 사용하여 테이블을 잠가야 합니다.에일리어스를 지정하지 않으면 테이블을 잠글 수 없습니다.

반대로 에일리어스를 사용하여 테이블을 잠글 경우 해당 에일리어스를 사용하는 문장에서 참조해야 합니다.

틀렸다:

LOCK TABLE my_table READ;
SELECT * FROM my_table t;
#ERROR 1100: Table 't' was not locked with LOCK TABLES

정답:

LOCK TABLE my_table t READ;
SELECT * FROM my_table t;

이 문제가 발생했습니다.

LOCK TABLE <table_a> READ;
LOCK TABLE <table_b> READ;
LOCK TABLE <table_a> WRITE;
LOCK TABLE <table_b> WRITE;

에서, '아주 좋다', '아주 좋다'가 나옵니다.Table 'table_a' was not locked with Lock Tables.

설명서를 읽은 후 잠금 코드를 다음과 같이 수정합니다.

LOCK TABLE <table_a> WRITE, <table_b> WRITE

이것으로 나는 문제를 해결했다.

잠금식

읽기 잠금, 쓰기 금지

WRITE 배타적 쓰기 잠금.다른 연결은 이 테이블을 읽거나 쓸 수 없습니다.

이 오류는 Windows에서 Linux로 데이터를 Import하려고 할 때 발생했습니다.Windows는 대소문자를 구분하지 않고 모두 소문자 테이블명이지만 Linux는 대소문자를 구분합니다.송신원테이블명의 대소문자를 행선지 테이블명과 일치하도록 변경하면, 이 에러는 발생하지 않게 됩니다.다음 SO 포스트에서는 mysql과 관련하여 Windows와 Linux 간의 대소문자를 구분하는 문제에 대해 설명합니다.MySQL의 테이블 이름은 대소문자를 구분합니까?

스토어드 프로시저에 분기된 프로세스가 있었습니다.이것이 에러의 원인이 되고 있었다.

#ERROR 1100: Table 'cached_sales_data' was not locked with LOCK TABLES

다음 SQL 문에 대해 설명합니다.

LOCK TABLES cached_sales_data WRITE, v_sales_data_2 READ;
call refresh_sales_data_now ();
UNLOCK TABLES;

실제로는 refresh_sales_data_now() 스토어드 프로시저의 where 구 서브쿼리에 의해 발생하였습니다.

...
where
  orderdatetime > (select max(orderdatetime)
from
  cached_sales_data)

문서에 따르면 첫 번째 잠금 중에 에일리어스를 사용하여 두 번째 READ 잠금을 생성하여 세컨더리 선택에 대해 에일리어스를 쓰고 사용할 수 있습니다.

LOCK TABLES cached_sales_data WRITE, cached_sales_data는 csd READ, v_sales_data_2 READ,

...
where
  orderdatetime > (select max(orderdatetime)
from
  csd)

언급URL : https://stackoverflow.com/questions/36467298/mysql-table-my-table-was-not-locked-with-lock-tables