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

Избягвайте мъртво заключване, като поръчате изрично

Въпреки че можете да го направите чрез straight_join, можете също така изрично да получите ключалките на редовете, които искате, като дублирате select ... за актуализация на този, който искате да получите първи.

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;

Тъй като заключването се извършва на няколко стъпки, би било възможно записите в таблицата „цветове“ да се променят между това, когато настроите временната таблица и когато приключите с получаването на ключалките на двете маси.

Това може да е добре за вас (т.е. ако искате да промените само съществуващите записи, когато транзакцията започне), но може да причини фини грешки, ако не е това, което искате.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-простият случай на карта един към много в Hibernate не работи в MySQL

  2. Преместване на сайта на Wordpress към Docker:Грешка при установяване на DB връзка

  3. Mysql свързва две таблици с различен ред от лявата страна и същия ред от дясната страна

  4. Как да активирате бавния регистър на заявките в MySQL

  5. 100% безопасен начин за съхранение на html в MySQL