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

Hindari kunci mati dengan memesan secara eksplisit

Meskipun Anda dapat melakukannya melalui straight_join, Anda juga dapat secara eksplisit mendapatkan kunci pada baris yang Anda inginkan dengan menduplikasi pilihan ...untuk pembaruan pada baris yang ingin Anda dapatkan terlebih dahulu.

CREATE TEMPORARY TABLE colorsToUpdate (
     colorID BIGINT(20) NOT NULL, 
     modelID BIGINT(20) NOT NULL
);

insert into colorsToUpdate ( colorID, modelID)
SELECT  id, model_id
FROM    colors
where id in (101, 105, 106);

#This will try to acquire lock on models
select m.* from models m
join colorsToUpdate c
on c.modelID = m.id
for UPDATE;

#this will try to get locks on models, and colors.
select m.*, c.*
from colorsToUpdate u
left join models m
on u.modelID = m.id
join colors c 
on u.colorID = c.ID
order by m.id asc, c.id asc
for update;

# do your data modification here.

drop table colorsToUpdate;

Karena penguncian dilakukan dalam beberapa langkah, entri dalam 'warna' tabel dapat dimodifikasi antara saat Anda menyiapkan tabel sementara dan saat Anda selesai mendapatkan kunci pada dua tabel.

Itu mungkin baik untuk Anda (yaitu jika Anda hanya ingin mengubah entri yang ada, saat transaksi dimulai) tetapi dapat menyebabkan bug halus jika bukan itu yang Anda inginkan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tukar nilai dua kolom di antara dua tabel

  2. ORDER BY Color dengan Kode Hex sebagai kriteria di MySQL

  3. Kolom kardinalitas yang lebih tinggi pertama dalam indeks ketika melibatkan rentang?

  4. Mengembalikan hasil kueri dalam urutan yang telah ditentukan sebelumnya

  5. Kolom MySQL tidak dikenal dalam klausa ON