Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa IX-lock kompatibel dengan IX-lock lain di InnoDB?

https://dev.mysql.com/doc /refman/5.6/en/innodb-lock-modes.html mengatakan:

Ini berarti beberapa utas dapat memperoleh kunci IX. Kunci ini berada di level tabel, bukan level baris. Kunci IX berarti bahwa utas yang menahannya bermaksud memperbarui beberapa baris di suatu tempat di meja. Kunci IX hanya dimaksudkan untuk memblokir operasi tabel penuh.

Ini mungkin menjelaskan beberapa jika Anda menganggapnya berjalan dua arah -- jika operasi tabel penuh sedang berlangsung, maka utas tersebut memiliki kunci tingkat tabel yang memblokir kunci IX.

Operasi DML harus terlebih dahulu memperoleh kunci IX sebelum dapat mencoba kunci tingkat baris. Alasannya adalah Anda tidak ingin DML diizinkan saat ALTER TABLE sedang berlangsung, atau ketika beberapa utas lain telah melakukan LOCK TABLES...WRITE .

Perubahan tingkat baris seperti UPDATE , DELETE , SELECT..FOR UPDATE tidak diblokir oleh kunci IX. Mereka diblokir oleh perubahan tingkat baris lainnya, atau oleh kunci tabel lengkap yang sebenarnya (LOCK TABLES , atau pernyataan DDL tertentu). Namun selain dari operasi tabel tersebut, beberapa utas yang menjalankan DML mungkin dapat bekerja secara bersamaan, selama masing-masing utas bekerja pada sekumpulan baris yang tidak tumpang tindih.

Kembali komentar Anda:

SELECT...FOR UPDATE tidak diblokir menunggu di kunci IX, diblokir menunggu di kunci X (level baris) di baris yang sudah dikunci oleh X-lock di utas lain.

Saya baru saja mencoba ini dan kemudian saya menjalankan SHOW ENGINE INNODB STATUS jadi saya bisa melihat transaksi yang diblokir:

---TRANSACTION 71568, ACTIVE 12 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 10, OS thread handle 140168480220928, query id 288 localhost root statistics
select * from test where id=1 for update
------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 802 page no 3 n bits 72 index `PRIMARY` of table `test`.`test` 
trx id 71568 lock_mode X locks rec but not gap waiting

Melihat? Dikatakan sedang menunggu untuk diberikan kunci dengan lock_mode X pada indeks kunci utama dari tabel test . Itu kunci tingkat baris.

Kembali kebingungan Anda tentang LOCK IN SHARE MODE :

Anda sedang berbicara tentang tiga level SELECT .

  • SELECT tidak meminta kunci. Tidak ada kunci yang memblokirnya, dan tidak ada kunci lain yang menghalangi.
  • SELECT ... LOCK IN SHARE MODE meminta kunci IS di atas meja, dan kemudian S mengunci baris yang cocok dengan pemindaian indeks. Beberapa utas dapat menahan kunci IS atau kunci IX di atas meja. Beberapa utas dapat menahan kunci S secara bersamaan.
  • SELECT ... FOR UPDATE meminta kunci IX pada tabel, lalu X mengunci pada baris yang cocok dengan pemindaian indeks. Kunci X adalah eksklusif yang berarti mereka tidak dapat memiliki utas lain untuk memiliki kunci X atau kunci S pada baris yang sama.

Tetapi baik kunci X maupun S tidak peduli dengan kunci IX atau IS.

Pikirkan analogi ini:bayangkan sebuah museum.

Banyak orang, baik pengunjung maupun kurator, memasuki museum. Para pengunjung ingin melihat lukisan, sehingga mereka memakai lencana berlabel "ADALAH". Kurator dapat mengganti lukisan, sehingga mereka memakai lencana berlabel "IX". Mungkin ada banyak orang di museum pada saat yang sama, dengan kedua jenis lencana. Mereka tidak saling memblokir.

Selama kunjungan mereka, para penggemar seni yang serius akan sedekat mungkin dengan lukisan itu, dan mempelajarinya untuk waktu yang lama. Mereka senang membiarkan penggemar seni lain berdiri di samping mereka di depan lukisan yang sama. Oleh karena itu mereka melakukan SELECT ... LOCK IN SHARE MODE dan mereka memiliki kunci "S" karena mereka setidaknya tidak ingin lukisan itu diganti saat mereka mempelajarinya.

Kurator dapat mengganti lukisan, tetapi mereka sopan kepada penggemar seni yang serius, dan mereka akan menunggu sampai pemirsa selesai dan melanjutkan. Jadi mereka mencoba melakukan SELECT ... FOR UPDATE (atau cukup UPDATE atau DELETE ). Mereka akan memperoleh kunci "X" saat ini, dengan menggantungkan tanda kecil bertuliskan "pameran sedang didesain ulang." Penggemar seni yang serius ingin melihat seni disajikan dengan cara yang tepat, dengan pencahayaan yang bagus dan beberapa plakat deskriptif. Mereka akan menunggu desain ulang selesai sebelum mereka mendekat (mereka mendapat kuncian, tunggu jika mereka mencoba).

Juga, Anda mungkin pernah berada di museum di mana lebih banyak pengunjung biasa berkeliaran, mencoba untuk tidak mengganggu orang lain. Mereka melihat lukisan dari tengah ruangan, tidak mendekat terlalu dekat. Mereka dapat melihat lukisan yang sama dengan yang dilihat oleh pemirsa lain, dan mereka dapat mengintip dari balik bahu para penggemar seni yang serius, untuk melihat lukisan-lukisan yang sedang dilihat juga. Mereka bahkan mungkin melongo pada kurator saat mereka mengganti lukisan (mereka tidak peduli jika mereka melihat lukisan yang belum dipasang dan diberi penerangan dengan benar). Jadi pengunjung biasa ini tidak memblokir siapa pun, dan tidak ada yang menghalangi pandangan mereka. Mereka hanya melakukan SELECT dan mereka tidak meminta kunci apa pun.

Tetapi ada juga pekerja konstruksi yang seharusnya meruntuhkan tembok dan barang-barang lainnya, tetapi mereka tidak akan bekerja saat ada orang di dalam gedung. Mereka akan menunggu semua orang pergi, dan begitu mereka mulai bekerja, mereka tidak akan membiarkan siapa pun masuk. Begitulah keberadaan lencana IS dan IX memblokir DDL (pekerjaan konstruksi), dan sebaliknya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ALTER TABEL SEPERTI

  2. Kueri MySQL Nilai Minimum

  3. Pada Kunci Duplikat hanya perbarui nilai Null atau kosong

  4. SQL menggabungkan hasil menjadi objek di codeigniter

  5. Bisakah bidang dengan tipe DATE memiliki nilai DEFAULT dengan CURRENT_TIMESTAMP?