1206: The total number of locks exceeds the lock table size
MySQLNe demek?
InnoDB, tuttuğu lock'lar için ayrılan bellek (buffer pool içindeki lock yapısı) alanını tüketti. Tek bir transaction çok fazla row/range lock biriktirdiğinde ortaya çıkar ve transaction geri alınır.
Neden olur?
Çok büyük tek işlemler: milyonlarca satırı tek seferde UPDATE/DELETE etmek, WHERE koşulunun index'siz olup tüm tabloyu kilitlemesi, ya da innodb_buffer_pool_size'ın iş yüküne göre küçük olması. Büyük toplu (batch) işlemler klasik tetikleyicidir.
Nasıl çözülür?
Büyük DML'i küçük partilere bölün (ör. LIMIT ile döngüde 10.000'er satır silin/güncelleyin ve her partiden sonra COMMIT edin). WHERE koşullarını indeksleyerek kilitlenen satır sayısını azaltın. Kalıcı çözüm olarak innodb_buffer_pool_size değerini artırın (lock yapıları buradan beslenir). Gereksiz uzun transaction'lardan kaçının.
Aynı motorda diğer kayıtlar
- 1526ER_NO_PARTITION_FOR_GIVEN_VALUE: Table has no partition for value
- 1049Unknown database 'name'
- 1364Field 'name' doesn't have a default value
- 1236Got fatal error 1236 from master when reading data from binary log
- 1129Host 'host' is blocked because of many connection errors
- 1194Table 'name' is marked as crashed and should be repaired
- 1615Prepared statement needs to be re-prepared