Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL InnoDB мъртво заключване на SELECT с изключително заключване (ЗА АКТУАЛИЗИРАНЕ)

SELECT FOR UPDATE получава ексклузивно заключване с намерение на масата, преди да получи изключителното заключване на записа.

Следователно, в този сценарий:

X1: SELECT FOR UPDATE -- holds IX, holds X on 'lock_name'
X2: SELECT FOR UPDATE -- holds IX, waits for X on 'lock_name'
X1: INSERT -- holds IX, waits for X for the gap on `id`

възниква безизходица, тъй като и двете транзакции съдържат IX заключвам на масата и чакам X заключете записите.

Всъщност този сценарий е описан в MySQL ръководство за заключване .

За да заобиколите това, трябва да се отървете от всички индекси с изключение на този, в който търсите, тоест lock_name .

Просто пуснете първичния ключ в id .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. base64 кодиране в MySQL

  2. MySQL:актуализира поле само ако условието е изпълнено

  3. MySql - Как да получите стойност в предишния ред и стойност в следващия ред?

  4. Инсталирайте MySQL на Ubuntu 14.04

  5. MySQL Създаване на изглед, замяна на изглед и изхвърляне на изявления с примери